重写VIEw的ontouchEvent()方法,传递进来MotionEvent对象
调用MotionEvent对象的getAction()方法,获取当前动作
switch判断一下当前动作
事件为MotionEvent.ACTION_DOWN是手指第一次触摸屏幕
事件为MotionEvent.ACTION_MOVE是手指在屏幕上移动
事件为MotionEvent.ACTION_UP是手指离开屏幕
当手指触摸到屏幕
定义手指最后的坐标lastX
调用MotionEvent对象的getX() 方法,得到lastX的值
当手指在屏幕上移动
定义手指横向移动的距离dis
调用getX()-lastX就是移动的距离
定义滑动按钮的左边就是这个移动的距离
判断slIDeBtnleft位于合理的位置,0到背景图的宽度-滑动按钮的宽度
调用invalIDate()方法,刷新视图
onClick事件和ontouchEvent是有冲突
定义一个标志isDrag变量,如果有拖动发生,就把这个变量赋值true
在onCllick()方法里面对这个变量进行判断
当手指抬起的时候
判断当前slIDeBtnleft来确定当前按钮是开还是关的状态
slIDeBtnleft比较 maxleft的一半就能判断当前状态
package com.tsh.myswitchbtn;import androID.content.Context; androID.graphics.Bitmap; androID.graphics.BitmapFactory; androID.graphics.Canvas; androID.graphics.Paint; androID.util.AttributeSet; androID.vIEw.MotionEvent; androID.vIEw.VIEw; androID.vIEw.VIEw.OnClickListener;public class MyToggleBtn extends VIEw implements OnClickListener { //背景图片 private Bitmap bitmapBackground; 按钮图片 Bitmap bitmapBtn; Paint paint; /** * 布局文件中使用 * @param context * attrs */ public MyToggleBtn(Context context,AttributeSet attrs) { super(context,attrs); initVIEw(); } * 初始化vIEw private voID initVIEw() { bitmapBackground=BitmapFactory.decodeResource(getResources(),R.drawable.switch_background); bitmapBtn=new Paint(); paint.setAntiAlias(true); 点击事件 setonClickListener(this); } * 计算大小 */ @OverrIDe protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) { setMeasuredDimension(bitmapBackground.getWIDth(),bitmapBackground.getHeight()); } 当前状态 boolean currentState=false; 滑动按钮的当前left float slIDeBtnleft=0 * 绘制vIEw onDraw(Canvas canvas) { 绘制背景 canvas.drawBitmap(bitmapBackground,0,paint); 绘制滑动按钮 canvas.drawBitmap(bitmapBtn,slIDeBtnleft,paint); } boolean isDrag= * 点击事件 onClick(VIEw v) { 解决与移动事件的冲突 if(!isDrag){ currentState = !currentState; flushState(); } } lastX; * 触摸事件 firstX; @OverrIDe boolean ontouchEvent(MotionEvent event) { .ontouchEvent(event); switch(event.getAction()){ 手指按下 case MotionEvent.ACTION_DOWN: firstX=lastX=() event.getX(); isDrag=; break手指移动 MotionEvent.ACTION_MOVE: 解决与点击事件冲突 if(Math.abs(event.getX()-firstX)>5){ isDrag=; } int dis=(int) event.getX()-lastX; slIDeBtnleft=slIDeBtnleft+dis; lastX=() event.getX(); 手指抬起 MotionEvent.ACTION_UP: if(isDrag){ int maxleft = bitmapBackground.getWIDth() - bitmapBtn.getWIDth(); if (slIDeBtnleft >= maxleft / 2) { currentState = ; } else { currentState = ; } flushState(); } ; } flushVIEw(); return ; } * 刷新状态 flushState() { if (currentState == ) { slIDeBtnleft = bitmapBackground.getWIDth() - bitmapBtn.getWIDth(); } { slIDeBtnleft = 0; } invalIDate(); } * 刷新视图 flushVIEw() { int maxleft=bitmapBackground.getWIDth()-bitmapBtn.getWIDth(); slIDeBtnleft=(slIDeBtnleft>0) ? slIDeBtnleft : 0; slIDeBtnleft=(slIDeBtnleft<maxleft) ? slIDeBtnleft:maxleft; invalIDate(); }}
总结
以上是内存溢出为你收集整理的[android] 切换按钮-自定义控件-拖动效果全部内容,希望文章能够帮你解决[android] 切换按钮-自定义控件-拖动效果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)