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的更多相关文章

  1. 使用CAShapeLayer和UIBezierPath画一个自定义半圆弧button

    通常我们使用系统自带的UIButton时,一般都是Rect矩形形式的,或则美工给出一张半圆弧的按钮,如图为一张半圆加三角形的按钮,而此时,如果给按钮添加点击事件时,响应事件依然为矩形区域,不符合我们的 ...

  2. 使用 HTML5 & CSS 实现一个自定义开关按钮 switch button

    使用 HTML5 & CSS 实现一个自定义开关按钮 switch button switch button <div class="switch"> < ...

  3. 自定义View(7)官方教程:自定义View(含onMeasure),自定义一个Layout(混合组件),重写一个现有组件

    Custom Components In this document The Basic Approach Fully Customized Components Compound Controls ...

  4. ExtJs5_继承自定义一个控件

    Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一 ...

  5. 6、手把手教你Extjs5(六)继承自定义一个控件

    Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一 ...

  6. SpringMVC 自定义一个拦截器

    自定义一个拦截器方法,实现HandlerInterceptor方法 public class FirstInterceptor implements HandlerInterceptor{ /** * ...

  7. 【Map】获取字符串中,每一个字母出现的次数

    package cn.itcast.p1.map.test; import java.util.Iterator; import java.util.Map; import java.util.Tre ...

  8. jQuery Validate 表单验证插件----自定义一个验证方法

    一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...

  9. Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例

    利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...

随机推荐

  1. 切换数据库+ThreadLocal+AbstractRoutingDataSource 一

    最近项目用的数据库要整合成一个,所以把多源数据库切换的写法要清除掉.所以以下记载了多远数据库切换的用法及个人对源码的理解. 框架:Spring+mybatis+vertx,(多源数据库切换的用法不涉及 ...

  2. iOS程序启动流程(留有问题)

    程序的简单运行流程: 读取Main.storyboard文件 创建箭头所指的ViewController对象 根据storyboard文件中描述创建ViewController的UIView对象 将U ...

  3. 如何撤销 PhpStorm/Clion 等 JetBrains 产品的 “Mark as Plain Text” 操作 ?

    当把某个文件“Mark as Plain Text”时,该文件被当做普通文本,就不会有“代码自动完成提示”功能,如下图所示: 但是呢,右键菜单中貌似没有 相应的撤销 操作, 即使是把它删除,再新建一个 ...

  4. PHP中curl的CURLOPT_POSTFIELDS参数使用细节

    CURL确实是一个不错的好工具,不仅在PHP中还是其他的操作系统中,都是一个非常好用的.但是如果你有些参数没有用好的话,那可能会得不到自己理想中的结果. 在通常情况下,我们使用 CURL 来提交 PO ...

  5. JavaScript学习总结(二)数组和对象部分

    pt学习总结(二)数组和对象部分 2016-09-16    分类:WEB开发.编程开发.首页精华暂无人评论     来源:trigkit4 分享到:更多1 对象部分 Object类型 Object  ...

  6. C和指针 第十二章 使用结构和指针

    链表是一种常用的数据结构,每个节点通过链或者指针链接在一起,程序通过间接指针访问链表中的节点. typedef struct Node { //指向下一个节点的指针 struct Node *next ...

  7. jquery版小型婚礼(可动态添加祝福语)

    前两天在网上不小心看到“js许愿墙”这几个字,我的神经就全部被调动了.然后就开始我的百度生涯,一直寻觅许愿墙背景图片和便利贴图片,觅了好久……一直没找到满意的……无意间看到祝福语和一些卡通婚礼图片.最 ...

  8. Linux使用手册-时区和时间设置

    1. #vi /etc/sysconfig/clockZONE=”Asia/Shanghai”UTC=false2.#vi /usr/share/zoneinfo/Asia/Shanghai,如果结尾 ...

  9. vim 使用

    vim有三种模式:输入模式,命令模式,底行模式,使用esc进入命令模式,在命令模式下按英文的冒号,进入底行模式:命令行模式下按i进入输入模式.vim编辑文件是将文件内容复制到缓冲区显示在屏幕上. vi ...

  10. 个人Win10 +archlinux安装笔记

    win10+archlinux 1.查看磁盘并分区并挂载1.1 分区/dev/sda1 WIN10 保留分区/dev/sda2 WIN10 ESP分区(EFI)/dev/sda3 WIN10 MSR分 ...