`
cwh643
  • 浏览: 126775 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

android上类似iphone上的开关按钮

 
阅读更多
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
1
分享到:
评论

相关推荐

    android开发仿iphone开关按钮

    android开发仿iphone开关按钮

    Android中仿iphone开关按钮SwitchButton的基本使用

    Android中仿iphone开关按钮SwitchButton的基本使用,详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/60480014

    Android自定义Iphone风格的圆角边框开关按钮

    Android自定义Iphone风格的圆角边框开关按钮,用xml实现,无图片资源

    android SwitchButton 滑动开关按钮

    自定义滑动开关按钮,可左右滑动切换开关状态,也可点击切换。与iPhone的开关组件效果一样。

    android高仿iphne开关

    有时候我们在Android开发的时候需要iphone中的设置按钮,这个时候只能重写checkbox来自定义了,详细请看:http://blog.csdn.net/dawanganban/article/details/19081773

    《jQuery Mobile快速入门》.((美)Brad Broulik ).[PDF]

    具有一定开发经验的android开发人员和iphone/ipad开发人员在学完本书后,也可以通过一次编码,构建出可跨平台运行的app。 《jquery mobile快速入门》 第1章 jquery mobile简介 1 1.1 通用访问 1 1.2 跨所有...

    史上最全的ios开发源码

    苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等苹果产品上。iOS与苹果的Mac OS X操作系统一样,它也是以Darwin为基础的,因此...

    EasyGo漂浮

    EasyGo是一个像iPhone的AssistiveTouch的按钮, 它漂浮在你的手机屏幕(在任何APP之上), 你可以将它移动到任何地方. 功能 ★ 快速设置(如:打开Wifi,调节屏幕亮度,手机网路开关等). ★ 打开你常用的应用. ★ 回到主...

    柯林net9.0最新破解版

    |iPhone|ios|Android|Opera|CE|UC|QQ|Phone|Mobile|Mozilla"/&gt; 5.增加防串号后捣乱功能,网站默认设置增加:[31]发贴回贴发短信等是否需要密码验证 一些重要操作也增加每次需要录入密码验证功能。 6.增加过滤...

Global site tag (gtag.js) - Google Analytics