Android自定义View实战-100行带你写出SwitchButton

1 序言

网上很多自定义View的例子都非常详细讲解了如何写出一个高效实用的自定义View,但是这些由于过于详细,给予一些新手的学习造成了一定的困难,比如说,当初我要学习如何自定义下拉刷新控件,结果,很多大神顺便把一些在我看来 学习自定义View非必要的技术带了进来,如数据结构啊,事件分发机制啊.这些东西不是说不必要,但是他们应该放到别的文章里面,否则对新手来说,让他们去思考这些繁杂的机制,而容易陷入细节不能自拔.这些技术在这篇文章里,他们只是充当辅助的角色,不是我们的主角,我们的主角就是在ondraw里面花时间,然后写出来一个自定义View.这样我们就能更加专注写出一个View,在此基础上,我们再谈扩展和高效.

2 实现思路


我们首先观察一下,这个按钮在打开和关闭时的状态,最终可以发现,他只是一些简单的几何组合,所以我们可以通过代码来实现这个效果,

3 代码

public class SwithcButton extends View {

	private Paint mPaint;
	public int state=1;  //状态,0位开,1位关.默认为关闭状态
	
	
	public SwithcButton(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		mPaint=new Paint();
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			
			postInvalidate();
			isAnim=true;
			break;

		default:
			break;
		}
		
		return true;
	}
	boolean isAnim;		//是否在播放动画
	float scale=0.9f;	//画布缩放比例
	float offsetX=0;   //按钮X轴偏移量
	
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		if(state==1){
		mPaint.setColor(0xffcccccc);
		}else{
			mPaint.setColor(Color.GREEN);	
		}
        mPaint.setShadowLayer(0, 0, 0, Color.GRAY);  
		RectF mRectF=new RectF(0, 0, 100,50);
		canvas.drawRoundRect(mRectF, 50, 50, mPaint);
		mPaint.setColor(0xffffffff);
		canvas.save();
		canvas.scale(scale, scale, 50, 25);
		canvas.drawRoundRect(mRectF, 50, 50, mPaint);
		canvas.restore();
		if(state==1 && isAnim){
			scale-=0.1;
			offsetX+=5;
			invalidate();
			if(scale<=0.01){
				isAnim=false;
				state=0;
				scale=0.01f;
				offsetX=50;
				Log.i("test", "open");
			}
		}
		if(state==0 && isAnim){
			scale+=0.1;
			offsetX-=5;
			invalidate();
			if(scale>=0.9f){
				isAnim=false;
				state=1;
				scale=0.9f;
				offsetX=0;
				Log.i("test", "close");
			}
		}
		mPaint.setColor(0xffdddddd);
        mPaint.setShadowLayer(10, 0, 0, Color.GRAY);  
        canvas.save();
        canvas.translate(offsetX, 0);
		canvas.drawRoundRect(new RectF(1,1,48,48), 48, 48,mPaint);
		canvas.restore();
	}
}

4 最终效果


以上,便实现了一个简单的 switchbutton,有些同学说,你好像没有测量View啊,你这样的话如果我设置了不同的宽高模式,会不会出现一些很奇怪的显示效果呢?额,现在统一回复一下,这不是我们本篇文章的重点,关于View测量,大家可以看这篇来分别学习.http://blog.csdn.net/oxuanboy1/article/details/51148353  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值