自定义Switch——第一次写博客

来源:互联网 发布:淘宝店仓库管理制度 编辑:程序博客网 时间:2024/06/06 03:13

本人勉强算是一枚初中级的Android开发吧,接触Android大概有一年左右的时间了。其实也就是工作了将近一年左右的时间,从大学校园步入社会工作感概万千,当然技术上的收获还是很大的。可能技术人员都会写点博客吧,那我也就随着大伙浪一波。偷笑
深夜突发奇想写点什么那?以前用过系统自带的Switch。但是只能是4.0以上的系统才可以用。(本人目前的主要工作内容是支付SDK,boss让我兼容到2.3–MD大哭)。好吧自己动手丰衣足食,其实这个东西很简单。话不多说上代码。可能写这个就是给自己看,好让自己的思路更加清晰点。额~莫名都这么晚了。

   package com.dyk.viewdemo;    import android.content.Context;    import android.graphics.Bitmap;    import android.graphics.BitmapFactory;    import android.graphics.Canvas;    import android.graphics.Matrix;    import android.graphics.Paint;    import android.util.AttributeSet;    import android.view.MotionEvent;    import android.view.View;    /**      * Created by DYK on 2015/10/10.    */       public class SwitchButton extends View implements  View.OnTouchListener {//两张背景一个滑动的小按钮,不一定非得是Bitmap,发挥想象力咯    private Bitmap bg_Open;    private Bitmap bg_Close;    private Bitmap slip_Button;//OnTouch()记录你的手指轨迹然后在onDraw()里绘制(这都是国际惯例了)     private float StartX;     private float EndX;//两个标记的小东西,是否在滑动?是open还是close?    private boolean IsSlip = false;    private boolean Status = false;//对外的接口,要不然别人怎么知道是打开还是关闭    private OnChangedListener onChangedListener;    public SwitchButton(Context context) {        this(context, null);    }    public SwitchButton(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }//获取资源,没啥好玩的    private void init() {        bg_Open = BitmapFactory.decodeResource(getResources(), R.drawable.open);        bg_Close = BitmapFactory.decodeResource(getResources(), R.drawable.close);        slip_Button = BitmapFactory.decodeResource(getResources(), R.drawable.slip);        setOnTouchListener(this);    }//简单期间,直接把大小设置成了背景图的大小,开发中不要这么做    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        setMeasuredDimension(bg_Open.getWidth(), bg_Open.getHeight());    }//根据你Action.up的X位置实现活动和最终status的判断,小学生都能搞定。关于图片的缩放你可以好好的研究下,一用矩阵啦和Rect。    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        Matrix matrix = new Matrix();        Paint paint = new Paint();        if (EndX < bg_Open.getWidth() / 2)            canvas.drawBitmap(bg_Open, matrix, paint);        else            canvas.drawBitmap(bg_Close, matrix, paint);        float tempX = 0;        if (IsSlip) {            if (EndX >= bg_Open.getWidth())                tempX = bg_Open.getWidth() - slip_Button.getWidth() / 2;            else                tempX = EndX - slip_Button.getWidth() / 2;        } else {            if (Status)                tempX = bg_Open.getWidth() - slip_Button.getWidth();            else                tempX = 0;        }        if (tempX < 0)            tempX = 0;        else if (tempX > bg_Open.getWidth() - slip_Button.getWidth()) {            tempX = bg_Open.getWidth() - slip_Button.getWidth();        }        canvas.drawBitmap(slip_Button, tempX, 0, paint);    }    @Override    public boolean onTouch(View view, MotionEvent motionEvent) {        switch (motionEvent.getAction()) {            case MotionEvent.ACTION_DOWN:                if (motionEvent.getX() > bg_Open.getWidth() || motionEvent.getY() > bg_Open.getHeight())                    return false;                else {                    IsSlip = true;                    StartX = motionEvent.getX();                    EndX = StartX;                }                break;            case MotionEvent.ACTION_MOVE:                EndX = motionEvent.getX();                break;            case MotionEvent.ACTION_UP:                IsSlip = false;                if (motionEvent.getX() >= bg_Open.getWidth() / 2) {                    Status = true;                    EndX = bg_Open.getWidth() - slip_Button.getWidth();                } else {                    Status = false;                    EndX = 0;                }               // onChangedListener.OnChangedListner(Status);                break;        }        invalidate();        return true;    }    public void setStatus(boolean status) {        if (status)            EndX = bg_Open.getWidth();        else            EndX = 0;        Status = status;    }    public void setOnChangedListener(OnChangedListener listener) {        onChangedListener = listener;    }    public interface OnChangedListener {        public void OnChangedListner(boolean status);    }}

国际惯例上图,那三张图是我用画图工具自己画的,嘻嘻
这里写图片描述

0 0
原创粉丝点击