自定义一个字母Button
package com.example.administrator.yunstore.widget; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button; /**
* Created by Administrator on 2016/10/19.
* 自定义的一个字母button
*/ public class LetterButton extends Button { // 分类字母
private String[] assort = { "A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z" }; private Paint paint = new Paint(); private int selectIndex = -1; public LetterButton(Context context) {
super(context);
} public LetterButton(Context context, AttributeSet attrs) {
super(context, attrs);
} public LetterButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} /**
* @param canvas
* 对按钮进行绘制
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas); int height=getHeight();
int width=getWidth();
int interval = height / assort.length; for (int i = 0, length = assort.length; i < length; i++) {
// 抗锯齿
paint.setAntiAlias(true);
// 默认粗体
paint.setTypeface(Typeface.DEFAULT_BOLD);
// 白色
paint.setColor(Color.BLUE);
if (i == selectIndex) {
// 被选择的字母改变颜色和粗体
paint.setColor(Color.parseColor("#33bb99"));
paint.setFakeBoldText(true);
paint.setTextSize(30);
}
// 计算字母的X坐标
float xPos = width / 2 - paint.measureText(assort[i]) / 2;
// 计算字母的Y坐标
float yPos = interval * i + interval;
canvas.drawText(assort[i], xPos, yPos, paint);
paint.reset();
}
} @Override
public boolean dispatchTouchEvent(MotionEvent event) {
float y = event.getY();
int index = (int) (y / getHeight() * assort.length);
if (index >= 0 && index < assort.length) { switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
// 如果滑动改变
if (selectIndex != index) {
selectIndex = index;
if (onTouch != null) {
onTouch.onTouchAssortListener(assort[selectIndex]);
} }
break;
case MotionEvent.ACTION_DOWN:
selectIndex = index;
if (onTouch != null) {
onTouch.onTouchAssortListener(assort[selectIndex]);
} break;
case MotionEvent.ACTION_UP:
if (onTouch != null) {
onTouch.onTouchAssortUP();
}
selectIndex = -1;
break;
}
} else {
selectIndex = -1;
if (onTouch != null) {
onTouch.onTouchAssortUP();
}
}
invalidate(); return true;
} @Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
//字母监听器
private OnTouchAssortListener onTouch; public interface OnTouchAssortListener {
void onTouchAssortListener(String s);
void onTouchAssortUP();
} public void setOnTouchAssortListener(OnTouchAssortListener onTouch) {
this.onTouch = onTouch;
}
}
自定义一个字母Button的更多相关文章
- 使用CAShapeLayer和UIBezierPath画一个自定义半圆弧button
通常我们使用系统自带的UIButton时,一般都是Rect矩形形式的,或则美工给出一张半圆弧的按钮,如图为一张半圆加三角形的按钮,而此时,如果给按钮添加点击事件时,响应事件依然为矩形区域,不符合我们的 ...
- 使用 HTML5 & CSS 实现一个自定义开关按钮 switch button
使用 HTML5 & CSS 实现一个自定义开关按钮 switch button switch button <div class="switch"> < ...
- 自定义View(7)官方教程:自定义View(含onMeasure),自定义一个Layout(混合组件),重写一个现有组件
Custom Components In this document The Basic Approach Fully Customized Components Compound Controls ...
- ExtJs5_继承自定义一个控件
Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一 ...
- 6、手把手教你Extjs5(六)继承自定义一个控件
Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一 ...
- SpringMVC 自定义一个拦截器
自定义一个拦截器方法,实现HandlerInterceptor方法 public class FirstInterceptor implements HandlerInterceptor{ /** * ...
- 【Map】获取字符串中,每一个字母出现的次数
package cn.itcast.p1.map.test; import java.util.Iterator; import java.util.Map; import java.util.Tre ...
- jQuery Validate 表单验证插件----自定义一个验证方法
一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...
- Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例
利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...
随机推荐
- [译]git的那些flag
git add -p console有一个交互式的界面(如下图),让你一个一个文件的选择是add还是不add.注意这些文件必须是tracked过的, 也就是说如果你的新的文件从来没有add过,那么他不 ...
- 商品库存“存取设计”,MySQL事务、表锁、行锁
MySQL 使用 SELECT ... FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的 Tansaction isolation level 为 REPEATA ...
- C和指针 第十三章 习题
1,1标准输入读入字符,统计各类字符所占百分比 #include <stdio.h> #include <ctype.h> //不可打印字符 int isunprint(int ...
- MySQL 常用SQL技巧和常见问题
一.巧用正则表达式 二.巧用RAND() 提取随机行 利用rand() 的随机数功能,结合 order by 子句完成随机抽取某些行的功能. 三.利用 group by 的 with rollup 子 ...
- CentOS 7下安装Mono
最近的项目中需要用到Linux作为服务器,而我们的开发技术是基于.NET的,所以只能在CentOS 7上尝试着安装一下Mono,下面是具体的安装步骤: 1.安装一些必备的依赖项 yum -y inst ...
- python之路七
静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量 ...
- python之路四
内建函数 内建函数详解: 1. abs(x) abs()函数返回数字(可为普通型.长整型或浮点型)的绝对值.如果给出复数,返回值就是该复数的模.例如: >>>print abs(-2 ...
- HTML文档、javascript脚本的加载与解析
1.onload事件 1.1 onload事件分类 a.文档加载完成事件(包括脚本.图片等资源都加载完),绑定方法:<body onload="doSomething()"& ...
- map set区别
STL中的容器有顺序容器 (vector,list,deque),关联容器(map,set)还有一些其他容器.根据不同的场合选择不同的容器,会有意想不到的收获. Map是单词mapping(映射)的缩 ...
- 【python】引用其他目录文件
假设有 目录/A(a.py), 目录/B(b.py), 括号里是目录中的文件 在目录/A中编写a2.py,里面可以import a,但是不能import b 解决方法 import sys sys.p ...