android上类似iphone上的开关按钮

本文介绍了一种自定义的Android滑动按钮实现方法,包括滑动状态改变监听及文字显示等功能。通过触摸事件和Canvas绘制实现了按钮的开关效果。

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);
    }
}


地址出处:http://www.apkbus.com/forum.php?mod=viewthread&tid=55593

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值