自定义View画出手机通讯录中右边字母,并设置TouchEvent/观察者模式
来源:互联网 发布:翻译软件app 编辑:程序博客网 时间:2024/06/06 14:24
首先画出26 个字母
1.画出26个字母首先需要一个字符数组,里面的包含了26个英文字母
2.设置字母的高度为当前View的总高度除以float类型的26,设置字母显示位置,横坐标是当前View 的宽度减去一个字母的宽度,这样可以让字母显示到View 的右边缘上,纵坐标是根据字母的高度,往下累加(见代码)
3.利用for循环绘制出26个字母
点击字母时确定点击的是哪个字母,点击是更换颜色
1.复写onTouchEvent方法,然后 switch (event.getAction()),需要case 的有三个参数
2.第一个参数MotionEvent.ACTION_DOWN:表示当按下时的操作
3.第二个参数MotionEvent.ACTION_MOVE:表示当移动时的操作(手在手机屏幕上移动时的操作)
4第三个参数MotionEvent.ACTION_UP:表示抬起来的操作(手离开手机屏幕时)
5.在MotionEvent.ACTION_DOWN:下面进行左边判断,首先通过event.getX()和event.getY()得到点击时的坐标,然后x轴的坐标是否是在这一列上,然后再用y的坐标值除以当个字母的高度,然后强制造型成为int类型index,index对应string数组中的对应的字母,就是点击到的字母
6.将index换成全局变量赋初始值为-1,(默认为什么都没有选),当点击时根据第5步,将重新给index赋值,将这个值在onDraw方法中做判断如果i==index就将该字母变为蓝色(改变Paint颜色即可)其他的不变
7.在第三个参数MotionEvent.ACTION_UP下重写将index=-1;表示当手离开屏幕时默认不选择
观察者模式通过点击字母将所选择的字母显示在TextView上
1.首先写一个接口里面写入一个方法,在该方法中传入当前点击字母位置,和字母
public interface OnItemSelect{ public void OnItemSelected(int index,String indexString); }
2.创建一个对象
private OnItemSelect listener;
3.设置该对象的set方法,将该对象传入
public OnItemSelect setOnItemListener(OnItemSelect listener) { this.listener=listener; return listener; }
4.在MotionEvent.ACTION_DOWN:下调用该对象,并将数值传入
if (listener!=null) { listener.OnItemSelected(index, array[index]); }
5.在Activity中
mySlider.setOnItemListener(new MySlider.OnItemSelect() { @Override public void OnItemSelected(int index, String indexString) { mTextView.setText(indexString); } });
代码实现
public class MySlider extends View { private int width; private int heigth; private Paint mPaint; private Paint mPaintBule; private long x; private long y; private int index=-1; String[] array={"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 MySlider(Context context) { super(context); } public interface OnItemSelect{ public void OnItemSelected(int index,String indexString); } private OnItemSelect listener; public OnItemSelect setOnItemListener(OnItemSelect listener) { this.listener=listener; return listener; } public MySlider(Context context, AttributeSet attrs) { super(context, attrs); mPaint=new Paint(); mPaint.setColor(Color.BLACK); mPaint.setTextAlign(Paint.Align.CENTER);//设置为居中的格式 mPaintBule=new Paint(); mPaintBule.setColor(Color.BLUE); mPaintBule.setTextAlign(Paint.Align.CENTER); } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); heigth = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec); setMeasuredDimension(width, heigth); //必须先测量height然后在设置 mPaint.setTextSize(heigth/26f); mPaintBule.setTextSize(heigth/26f); } @Override public boolean onTouchEvent(MotionEvent event) { x= (long) event.getX(); y= (long) event.getY(); switch (event.getAction()){ case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_DOWN: if (x>width-width-mPaint.measureText("m")*2){ index=(int)y/(heigth/26); Log.d("index","点击到的是"+array[index]); if (listener!=null) { listener.OnItemSelected(index, array[index]); } invalidate(); return true;//必须要return否则不管用 } break; case MotionEvent.ACTION_UP: index=-1; invalidate(); break; default: break; } return super.onTouchEvent(event); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); for (int i=0;i<array.length;i++){ if(i==index){ canvas.drawText(array[i],width-mPaint.measureText("m"),heigth/26f*(i+1),mPaintBule); }else { canvas.drawText(array[i], width - mPaint.measureText("m"), heigth / 26f * (i + 1), mPaint); } } }}
public class SliderActivity extends AppCompatActivity { private TextView mTextView; private MySlider mySlider; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.slider); mTextView= (TextView) findViewById(R.id.textview_item); mySlider= (MySlider) findViewById(R.id.my_slider); mySlider.setOnItemListener(new MySlider.OnItemSelect() { @Override public void OnItemSelected(int index, String indexString) { mTextView.setText(indexString); } });// mTextView.setText("d"); }}
- 自定义View画出手机通讯录中右边字母,并设置TouchEvent/观察者模式
- Android 自定义 View 实现通讯录字母索引(仿微信通讯录)
- Android 自定义 View 实现通讯录字母索引(仿微信通讯录)
- Android自定义View之用观察者模式写自定义监听事件以及常用竖直型字母索引栏的写法
- 自定义通讯录字母索引
- 自定义View画圆(观察者模式)
- Android 自定义 View 之处理 TouchEvent
- 自定义view____通讯录字母特效
- 高仿android通讯录--右边字母排序功能
- Andorid使用自定义View实现通讯录,媒体文件等等的ListView的字母索引
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- 自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- Android自定义控件5----继承View通讯录索引功能之1初始化显示字母列表
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- 自定义字母索引View
- 仿苹果手机通讯录按字母定位
- 自定义View-画出你的菜单
- 理解回调函数
- 为什么这些脑残应用能活而那些严肃牛逼的应用死了?
- 【设计模式】-简单工厂模式-SampleFactory
- 随笔
- javascript中的数据比较逻辑等
- 自定义View画出手机通讯录中右边字母,并设置TouchEvent/观察者模式
- Understand Android Activity's launchMode: standard, singleTop, singleTask and singleInstance
- 黑马程序员-----------C语言基础-----------C语言实战(C语言版通讯录)
- 海格面试题总结
- UVa 10340 All in All
- NOIP2014 Day2 T1
- Java获取股市交易日
- mongodb安装注意问题
- 那些不能错过的Xcode插件