Android自定义屏幕侧边字母排序控件
来源:互联网 发布:python中range 函数 编辑:程序博客网 时间:2024/06/05 02:30
看图片右侧字母排序的控件,触摸上面的字母,可迅速跳至指定字母分类,配合上一篇汉字转拼音,可以实现此功能。
如下代码,新建类,可copy直接使用。
import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.view.MotionEvent;import android.view.View;/** * 根据字母形成的索引栏 测试 * * Created by yangxiix on 2015/11/16. */public class LetterIndexBar extends View { private String[] mIndexer = {"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 int height; private int curChoose = -1; //当前选中 private OnTouchingLetterChangedListener onTouchingLetterChangedListener; private Paint mPaint; public LetterIndexBar(Context context) { this(context, null); } public LetterIndexBar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public LetterIndexBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); initData(canvas); } private void initData(Canvas canvas) { DisplayMetrics dm = getResources().getDisplayMetrics(); float density = dm.density; //像素密度 int width = getWidth(); height = getHeight(); int perHeight = height / mIndexer.length; canvas.drawColor(Color.parseColor("#FFC0CB")); //设置背景栏 mPaint = new Paint(); for (int i = 0; i < mIndexer.length; i++) { if (curChoose != -1 && i == curChoose) { mPaint.setTextSize(12 * density); mPaint.setColor(Color.parseColor("#FFFFFF")); //设置选中后的颜色 mPaint.setAntiAlias(true); //是否反锯齿 canvas.drawText(mIndexer[i], width / 2f - mPaint.measureText(mIndexer[i]) / 2f, perHeight + perHeight * i, mPaint); } else { mPaint.setTextSize(12 * density); mPaint.setColor(Color.parseColor("#FF0000")); //正常的颜色 mPaint.setAntiAlias(true); //是否反锯齿 canvas.drawText(mIndexer[i], width / 2f - mPaint.measureText(mIndexer[i]) / 2f, perHeight + perHeight * i, mPaint); //文字居中显示,宽度的一半 + 文体的一半 } mPaint.reset(); } } @Override public boolean dispatchTouchEvent(MotionEvent event) { float posY = event.getY(); final int oldChoose = curChoose; int curLetterPos = (int) (posY / height * mIndexer.length); final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (oldChoose != curLetterPos && listener != null) { if (curLetterPos < mIndexer.length && curLetterPos >= 0) { listener.onTouchingLetterChanged(mIndexer[curLetterPos]); curChoose = curLetterPos; invalidate(); } } break; case MotionEvent.ACTION_MOVE: if (oldChoose != curLetterPos && listener != null) { if (curLetterPos < mIndexer.length && curLetterPos >= 0) { listener.onTouchingLetterChanged(mIndexer[curLetterPos]); curChoose = curLetterPos; invalidate(); } } break; case MotionEvent.ACTION_UP: curChoose = -1; invalidate(); break; } return true; } public void setOnTouchingLetterChangedListener( OnTouchingLetterChangedListener onTouchingLetterChangedListener) { this.onTouchingLetterChangedListener = onTouchingLetterChangedListener; } public interface OnTouchingLetterChangedListener { public void onTouchingLetterChanged(String s); }}
我这边运行之后的效果是这样子的(颜色,字体都可以根据注释去改动):
如果你想做成颜色,字体大小由布局去实现你可以做如下小小的改进即可
定义一个attr.xml
里面定义代码:
<declare-styleable name="IndexerBar"> <attr name="show_common_icon" format="boolean" /></declare-styleable>
然后在自定义的控件里面初始化时获取相关参数:
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.IndexerBar);boolean show_common_icon = ta.getBoolean(R.styleable.IndexerBar_show_common_icon, true);
然后就可以用相关定义的参数啦,动动脑,定义字体大小颜色可以用此类似方法。
0 0
- Android自定义屏幕侧边字母排序控件
- [Android实例] 侧边字母滑动检索控件
- Android ListView侧边字母索引栏SideBar控件的实现
- RecyclerView+侧边字母索引排序
- RecyclerView侧边添加字母排序
- 自定义控件之仿电话簿汉字排序侧边拼音
- 快速集成android实现listview的字母A-Z排序,界面侧边字母索引
- 快速集成android实现listview的字母A-Z排序,界面侧边字母索引
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- Android ListView A-Z侧边栏字母排序,点击处扭曲成半圆
- Android 侧边字母导航栏的实现
- Android 带字母索引的侧边栏
- Android实现侧边栏按字母索引
- Android控件--侧边栏SideBar
- 仿美团炫酷动画效果的A-Z字母排序侧边库
- 自定义控件之android列表分组及字母导航
- 十二、Maven项目模板
- Linux crontab 命令格式与详细例子
- 一键分析Android的BugReport
- Android Service完全解析,关于服务你所需知道的一切(上)
- iBeacon开发基础
- Android自定义屏幕侧边字母排序控件
- IOS开发指南读书笔记4(IOS API分类)
- Java 8里面lambda的最佳实践
- cocos2dx中protobuf的lua使用
- swift----纯代码实现 UITableViewCell单元格的自定义
- 关于AppStore被拒后的申诉
- Linux使用expect实现远程拷贝文件
- mac install mongodb
- 如何在JS代码里获取浏览器地址栏传过来的参数/页面间传值