您的位置:首页 > 移动开发 > Android开发

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

2016-05-03 23:31 330 查看
重写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);
}
/**
* 计算大小
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(bitmapBackground.getWidth(), bitmapBackground.getHeight());
}
//当前状态
private boolean currentState=false;
//滑动按钮的当前left
private float slideBtnLeft=0;
/**
* 绘制view
*/
@Override
protected void onDraw(Canvas canvas) {
//绘制背景
canvas.drawBitmap(bitmapBackground, 0, 0, paint);
//绘制滑动按钮
canvas.drawBitmap(bitmapBtn, slideBtnLeft, 0, paint);
}
private boolean isDrag=false;
/**
* 点击事件
*/
@Override
public void onClick(View v) {
//解决与移动事件的冲突
if(!isDrag){
currentState = !currentState;
flushState();
}

}

private int lastX;
/**
* 触摸事件
*/
private int firstX;
@Override
public 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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: