Android自定义控件5----继承View通讯录索引功能之3在按下或和移动时显示更新提示字母
来源:互联网 发布:广州知行通航 编辑:程序博客网 时间:2024/06/11 00:56
效果图:
项目结构:
核心代码:
自定义控件
IndexView
package com.example;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.Typeface;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import com.orhanobut.logger.Logger;/** * 自定义通讯录 */public class IndexView extends View { /** * 每条的宽和高 */ private int itemWidth; private int itemHeight; private Paint paint; private String[] words = {"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"}; public IndexView(Context context, AttributeSet attrs) { super(context, attrs); paint = new Paint(); //设置颜色 paint.setColor(Color.WHITE); //设置抗锯齿 paint.setAntiAlias(true); //设置粗体字 paint.setTypeface(Typeface.DEFAULT_BOLD);// 设置字体大小 paint.setTextSize(DensityUtil.dip2px(context,20)); } /** * 测量方法 * * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); itemWidth = getMeasuredWidth(); itemHeight = getMeasuredHeight() / words.length; Logger.t("111").d("onMeasure>>>"); } /** * 绘制 * @param canvas */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Logger.t("111").d("onDraw>>>"); for (int i = 0; i < words.length; i++) { if(touchIndex ==i){ //设置灰色 paint.setColor(Color.GRAY); }else{ //设置白色 paint.setColor(Color.WHITE); } String word = words[i];//A Rect rect = new Rect(); //画笔 //0,1的取一个字母 paint.getTextBounds(word, 0, 1, rect); //字母的高和宽 int wordWidth = rect.width(); int wordHeight = rect.height(); //计算每个字母在视图上的坐标位置 float wordX = itemWidth / 2 - wordWidth / 2; float wordY = itemHeight / 2 + wordHeight / 2 + i * itemHeight; canvas.drawText(word, wordX, wordY, paint); } } /** * 字母的下标位置 */ private int touchIndex = -1; /** * 设置事件 * 按下的字母背景设置成灰色,放开时所有字母的背景设置为白色 * 手指按下文字变色 * 1.重写onTouchEvent(),返回true,在down/move的过程中计算 * int touchIndex = Y / itemHeight; 强制绘制 * <p/> * 2.在onDraw()方法对于的下标设置画笔变色 * <p/> * 3.在up的时候 * touchIndex = -1; * 强制绘制 * * @param event * @return */ @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: float Y = event.getY(); int index = (int) (Y/itemHeight);//字母索引 if(index != touchIndex){ touchIndex = index; invalidate();//强制绘制onDraw(); if(onIndexChangeListener != null&& touchIndex < words.length){ onIndexChangeListener.onIndexChange(words[touchIndex]); } } break; case MotionEvent.ACTION_UP: touchIndex = -1; invalidate();//强制绘制onDraw(); break; } return true; } /** * 接口回调 * 字母下标索引变化的监听器 */ public interface OnIndexChangeListener{ /** * 当字母下标位置发生变化的时候回调 * @param word 字母(A~Z) */ void onIndexChange(String word); } private OnIndexChangeListener onIndexChangeListener; /** * 设置字母下标索引变化的监听 * @param onIndexChangeListener */ public void setOnIndexChangeListener(OnIndexChangeListener onIndexChangeListener) { this.onIndexChangeListener = onIndexChangeListener; }}MainActivity中
package com.example;import android.app.Activity;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ListView;import android.widget.TextView;/** * 在按下或和移动时显示更新提示字母 */public class MainActivity extends Activity { private ListView lv_main; private TextView tv_word; private IndexView iv_words; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg){ switch (msg.what) { case 1:// 关闭显示的字母提示 tv_word.setVisibility(View.GONE); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); myOnclick(); } private void myOnclick() {// IndexView中回调出来的点击事件 iv_words.setOnIndexChangeListener(new IndexView.OnIndexChangeListener() { @Override public void onIndexChange(String word) {// 显示提示框 tv_word.setVisibility(View.VISIBLE); tv_word.setText(word+""); handler.removeCallbacksAndMessages(null); handler.sendEmptyMessageDelayed(1,3000); } }); } private void initView() { lv_main = (ListView) findViewById(R.id.lv_main); tv_word = (TextView) findViewById(R.id.tv_word); iv_words = (IndexView) findViewById(R.id.iv_words); }}activity_main.xml中
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.mytongxunlu.MainActivity"> <ListView android:id="@+id/lv_main" android:layout_width="match_parent" android:layout_height="match_parent" /> <TextView android:id="@+id/tv_word" android:layout_width="80dp" android:layout_height="80dp" android:layout_centerInParent="true" android:background="#44000000" android:gravity="center" android:text="A" android:textColor="#000000" android:textSize="30sp" android:visibility="gone" /> <com.example.IndexView android:id="@+id/iv_words" android:layout_width="30dp" android:layout_height="match_parent" android:layout_alignParentRight="true" android:background="#ff0000" /></RelativeLayout>工具类
DensityUtil
package com.example;import android.content.Context;/** * 工具类 dp 的单位 转成为 px */public class DensityUtil { /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */ public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); }}
源码下载:
Myself ---- mytongxunlu3
http://download.csdn.net/download/zhaihaohao1/10111351
参考视频:
http://www.gulixueyuan.com/course/124/learn#lesson/1925
阅读全文
0 0
- Android自定义控件5----继承View通讯录索引功能之3在按下或和移动时显示更新提示字母
- Android自定义控件5----继承View通讯录索引功能之2在按下和移动的时候操作字母变色
- Android自定义控件5----继承View通讯录索引功能之4在下按和移动时,列表更新
- Android自定义控件5----继承View通讯录索引功能之1初始化显示字母列表
- Android 自定义 View 实现通讯录字母索引(仿微信通讯录)
- Android 自定义 View 实现通讯录字母索引(仿微信通讯录)
- Android实现通讯录功能,排序+字母索引
- android仿微信通讯录字母索引控件
- 自定义通讯录字母索引
- Android-自定义控件之继承View
- Android 自定义控件之继承view
- 自定义View 实现字母快速索引控件
- Android 自定义View之消息提示控件
- Android 自定义View字母滑动索引
- Android 自定义View 字母索引条
- Android自定义View实现字母索引条
- android通讯录列表,A~Z字母提示view
- android通讯录列表,A~Z字母提示view
- 2卷积神经网络相关API详解-2.1TensorFlow之卷积操作API
- es6<一>
- Spark之CASE...WHEN...THEN...的两种实现方式
- js日常
- 流程进度显示
- Android自定义控件5----继承View通讯录索引功能之3在按下或和移动时显示更新提示字母
- java基础知识(二 对象和类)
- 每天回顾linux命令(grep)
- 动态页面切换
- Qt多线程编程总结(一)(所有GUI对象都是线程不安全的)
- 基于Postman的API自动化测试
- ELK(ElasticSearch, Logstash, Kibana)实时日志分析平台部署
- 不用找出门找大师,教你在家怎样给未出生的小孩算名字
- IO流:编码方式,字节字符区别以及一些流的父类的区别以及使用情况。