android实现类似iphone的开关按钮

package com.test;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class SlipButton extends View {

private boolean nowChoose = false;//记录当前按钮是否打开,true为打开,flase为关闭
private boolean onSlip = false;//记录用户是否在滑动的变量
private float nowX;//按下时的x,当前的x
private float downX;
private float baseX;
private OnChangedListener ChgLsn;
private Bitmap slip_btn;
private float centerX;

private float yes_text_width;
private float no_text_width;

private int btnWdith;
private String[] messages;

private Paint paint;

public SlipButton(Context context) {
super(context);
init();
}

public SlipButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

private void init() {
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
paint.setTextSize(14);
setMessages(new String[]{"Yes", "No"});
}

public void setButtonBitmap(Bitmap bitmap) {
if (bitmap == null) {
return;
}
slip_btn = bitmap;
btnWdith = slip_btn.getWidth() / 3;
centerX = btnWdith / 2;
}

public void setTextColor(int color) {
paint.setColor(color);
}

public void setTextSize(int size) {
paint.setTextSize(size);
}

public void setMessages(String[] messages) {
this.messages = messages;
yes_text_width = paint.measureText(messages[0]);
no_text_width = paint.measureText(messages[1]);
}

public void setStatusOn(boolean on) {
nowChoose = on;
}

public boolean getStatusOn() {
return nowChoose;
}

public void setOnChangedListener(OnChangedListener l) {
ChgLsn = l;
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (slip_btn == null) {
return;
}

float minX = centerX;
float maxX = getMeasuredWidth() - centerX;

if (onSlip) {
nowX = baseX - (downX - nowX);
nowX = Math.min(Math.max(minX, nowX), maxX);
} else {
if (nowChoose) {
nowX = maxX;
} else {
nowX = minX;
}
baseX = nowX;
}
canvas.drawBitmap(slip_btn, nowX - centerX - btnWdith, 0, paint);//画出游标.

int marginX1 = (int)(btnWdith - yes_text_width) / 2;
canvas.drawText(messages[0], nowX - centerX - marginX1 - yes_text_width, 22, paint);

int marginX2 = (int)(btnWdith - no_text_width) / 2;
canvas.drawText(messages[1], nowX + centerX + marginX2, 22, paint);
}


@Override
public boolean onTouchEvent(MotionEvent event) {
if (slip_btn == null) {
return false;
}

switch(event.getAction())//根据动作来执行代码
{
case MotionEvent.ACTION_MOVE://滑动
nowX = event.getX();
float moveX = downX - nowX;
if (Math.abs(moveX) > 5) {
onSlip = true;
}
break;
case MotionEvent.ACTION_DOWN://按下
downX = event.getX();
break;
case MotionEvent.ACTION_UP://松开
boolean LastChoose = nowChoose;
if (onSlip) {
moveX = downX - event.getX();
if (nowChoose) {
if ((moveX > 0) && (moveX >= centerX))
nowChoose = !nowChoose;
} else {
if ((moveX < 0) && (Math.abs(moveX) >= centerX))
nowChoose = !nowChoose;
}
} else {
nowChoose = !nowChoose;
}
onSlip = false;
if ((ChgLsn != null) && (LastChoose != nowChoose)) {
if (nowChoose) {
ChgLsn.onChanged(nowChoose, messages[0]);
} else {
ChgLsn.onChanged(nowChoose, messages[1]);
}
}
break;
default:
break;
}
invalidate();//重画控件
return true;
}

public interface OnChangedListener {
public void onChanged(boolean on, String value);
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值