谢谢收看自定义学习的第三期,放假前我曾畅想七天每天都更新,结果。。。


大家知道Android其实也自带滑动按钮叫Switch


上图中的WLAN,蓝牙就是典型的switch,但是这个按钮只支持4.0以上的手机。。所以有时候我们还是要自定义一个滑动按钮,而ios风格的滑动按钮比较好看,废话不说上代码。


/** * 画笔 */private Paint mPaint;/** * 按钮 */private Bitmap bitNormal;/** * 框架 */private Bitmap bitFram;/** * 底部的图片 */private Bitmap bitBottom;/** * 背景的黑色图片 */private Bitmap bitMask;/** * 实现俩图相交取上层 */private PorterDuffXfermode mXfermode;/** * 面积 */private RectF mRectF;/** * button按钮位置 */private float mBtnPos;/** * 状态为on时候位置 */private float mBtnOn;/** * 状态为off时候位置 */private float mBtnOff;/** 首次按下的X */private float mFirstDownX;/** 默认为开启 */private boolean isCheck = true;private int mClickTimeout;private int time;
<pre name="code" class="java"> 下面我们按部就班重写构造方法。。

  

public ViewButton(Context context) {this(context, null);// TODO Auto-generated constructor stub}public ViewButton(Context context, AttributeSet attrs) {this(context, attrs, 0);// TODO Auto-generated constructor stub}public ViewButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {mPaint = new Paint();mPaint.setColor(Color.WHITE);mClickTimeout = ViewConfiguration.getPressedStateDuration()+ ViewConfiguration.getTapTimeout();bitNormal = BitmapFactory.decodeResource(getResources(),R.drawable.checkswitch_btn_unpressed);bitFram = BitmapFactory.decodeResource(getResources(),R.drawable.checkswitch_frame);bitBottom = BitmapFactory.decodeResource(getResources(),R.drawable.checkswitch_bottom);bitMask = BitmapFactory.decodeResource(getResources(),R.drawable.checkswitch_mask);// off时距离为0mBtnOff = 0;// on的时候距离mBtnOn = bitFram.getWidth() - bitNormal.getWidth();//判断初始距离mBtnPos = isCheck ? mBtnOn : mBtnOff;mRectF = new RectF(0, 0, bitMask.getWidth(), bitMask.getHeight());        //图层相交时显示上层mXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);}
只是初始了一些变量

@Overrideprotected void onDraw(Canvas canvas) {canvas.saveLayerAlpha(mRectF, 225, Canvas.MATRIX_SAVE_FLAG| Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG| Canvas.FULL_COLOR_LAYER_SAVE_FLAG| Canvas.CLIP_TO_LAYER_SAVE_FLAG);canvas.drawBitmap(bitMask, 0, 0, mPaint);mPaint.setXfermode(mXfermode);// 绘制底部图片canvas.drawBitmap(bitBottom, mBtnPos, 0, mPaint);mPaint.setXfermode(null);canvas.drawBitmap(bitNormal, mBtnPos, 0, mPaint);canvas.restore();}

重写onDraw把图像画出来


public boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();int distance = (int) (event.getX() - mFirstDownX);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mFirstDownX = x;break;case MotionEvent.ACTION_MOVE:mBtnPos = (isCheck ? mBtnOn : mBtnOff) + distance;// 如果为on的时候还往左滑动if (isCheck && distance < 0) {mBtnPos = mBtnOn;return true;}// 如果为off的时候还往左滑动if (!isCheck && distance > 0) {mBtnPos = mBtnOff;return true;}//限制了最大距离if (distance > Math.abs(mBtnOn)) {mBtnPos = mBtnOff;}if (distance < mBtnOn) {mBtnPos = mBtnOn;}break;case MotionEvent.ACTION_UP:if (Math.abs(distance) >= Math.abs(mBtnOn)) {isCheck = !isCheck;}//点击事件time = (int) (event.getEventTime() - event.getDownTime());if (time < mClickTimeout) {isCheck = !isCheck;mBtnPos = isCheck ? mBtnOn : mBtnOff;}if (mBtnPos >= mBtnOn / 2) {mBtnPos = mBtnOff;}if (mBtnPos < mBtnOn / 2) {mBtnPos = mBtnOn;}break;default:break;}invalidate();return true;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int width = bitMask.getWidth();int height = bitMask.getHeight();setMeasuredDimension(width, height);}public void setCheck(boolean isCheck) {this.isCheck = isCheck;invalidate();}

上面就是一些事件的判断。。

自己的状态不太好啊。。去买脉动了


项目源码



更多相关文章

  1. Android实战简易教程-第五十七枪(分享小米手电筒源码)
  2. Android(安卓)判断网络状态,并且在没有网络的时候,打开网络设置对
  3. Android(安卓)自定义Button按钮显示样式(正常、按下、获取焦点)
  4. android第三天课程 activity生命周期
  5. Activity生命机制与状态保存机制
  6. Android如何将软键盘回车换成搜索等按钮,EditText中imeOptions属
  7. Android(安卓)eclipse 签名打包及遇到的错误
  8. android eclipse 和 源码 情况下 引用第三方jar
  9. android倒计时的简单实现

随机推荐

  1. android生命周期(详细总结)
  2. android:onClick都做了什么
  3. Android 4.0冰淇淋三明治SDK怎么下载
  4. android bluetooth
  5. android:fastScrollEnabled和android:dra
  6. android 图片浏览功能 图片放大缩小 使用
  7. Android中的文本框,图片以及点击事件的设
  8. Android取消EditText自动默认获取焦点行
  9. AutoCompleteTextView(自动完成文本框)
  10. textView 属性总结