1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > [android] 切换按钮-自定义控件-拖动效果

[android] 切换按钮-自定义控件-拖动效果

时间:2023-05-07 23:54:21

相关推荐

[android] 切换按钮-自定义控件-拖动效果

重写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;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;public class MyToggleBtn extends View implements OnClickListener {//背景图片private Bitmap bitmapBackground;//按钮图片private Bitmap bitmapBtn;private Paint paint;/*** 布局文件中使用* @param context* @param attrs*/public MyToggleBtn(Context context, AttributeSet attrs) {super(context, attrs);initView();}/*** 初始化view*/private void initView() {bitmapBackground=BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);bitmapBtn=BitmapFactory.decodeResource(getResources(), R.drawable.slide_button);paint=new Paint();paint.setAntiAlias(true);//点击事件setOnClickListener(this);}/*** 计算大小*/@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(bitmapBackground.getWidth(), bitmapBackground.getHeight());}//当前状态private boolean currentState=false;//滑动按钮的当前leftprivate float slideBtnLeft=0;/*** 绘制view*/@Overrideprotected void onDraw(Canvas canvas) {//绘制背景canvas.drawBitmap(bitmapBackground, 0, 0, paint);//绘制滑动按钮canvas.drawBitmap(bitmapBtn, slideBtnLeft, 0, paint);}private boolean isDrag=false;/*** 点击事件*/@Overridepublic void onClick(View v) {//解决与移动事件的冲突if(!isDrag){currentState = !currentState;flushState();}}private int lastX;/*** 触摸事件*/private int firstX;@Overridepublic boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);switch(event.getAction()){//手指按下case MotionEvent.ACTION_DOWN:firstX=lastX=(int) event.getX();isDrag=false;break;//手指移动case MotionEvent.ACTION_MOVE://解决与点击事件冲突if(Math.abs(event.getX()-firstX)>5){isDrag=true;}int dis=(int) event.getX()-lastX;slideBtnLeft=slideBtnLeft+dis;lastX=(int) event.getX();break;//手指抬起case MotionEvent.ACTION_UP:if(isDrag){int maxLeft = bitmapBackground.getWidth()- bitmapBtn.getWidth();if (slideBtnLeft >= maxLeft / 2) {currentState = true;} else {currentState = false;}flushState();}break;}flushView();return true;}/*** 刷新状态*/private void flushState() {if (currentState == true) {slideBtnLeft = bitmapBackground.getWidth()- bitmapBtn.getWidth();} else {slideBtnLeft = 0;}invalidate();}/*** 刷新视图*/private void flushView() {int maxLeft=bitmapBackground.getWidth()-bitmapBtn.getWidth();slideBtnLeft=(slideBtnLeft>0) ? slideBtnLeft : 0;slideBtnLeft=(slideBtnLeft<maxLeft) ? slideBtnLeft:maxLeft;invalidate();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。