欢迎使用CSDN-markdown编辑器

来源:互联网 发布:利用广告联盟做淘宝客 编辑:程序博客网 时间:2024/06/05 18:04

Android 自定义控件(一)

本例子已[SwitchView][6]为例:

  • 创建SwitchView类 extends View
public class SwitchView extends View {    private Bitmap backgroundBitmap;    private Bitmap slideBitmap;    private int lEFT;    private int l;    // 当前的状态    private static boolean open = false;    // 定义一个成员变量    private OnCheckedChangeListener listener;    // 回调方法    public void setOnChangeListener(OnCheckedChangeListener listener) {        this.listener = listener;    }    /**     * 1、声明接口     *      * @author Blake     *      */    public interface OnCheckedChangeListener {        void onCheckedChanged(SwitchView view, boolean idOpen);    }    public SwitchView(Context context) {        super(context);        init();    }    public SwitchView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    public SwitchView(Context context, AttributeSet attrs) {        super(context, attrs);        init();        open=attrs.getAttributeBooleanValue(                "http://schemas.android.com/apk/res/com.itsflfly.switchview",                "isChecked", false);        flushState();    }    /**     * 初始化     */    private void init() {        backgroundBitmap = BitmapFactory.decodeResource(getResources(),                R.drawable.switch_background);        slideBitmap = BitmapFactory.decodeResource(getResources(),                R.drawable.slide_button);        lEFT = backgroundBitmap.getWidth() - slideBitmap.getWidth();        setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                if (isClick) {                    if (open) {                        open = false;                    } else {                        open = true;                    }                    flushState();                }                isClick = true;            }        });    }    private int startX;    private int distance = 0;// 滑块滑动的距离 , 通过滑动的距离来进行是否点击事件    private boolean isClick = true;// 点击事件的标志    @SuppressLint("ClickableViewAccessibility")    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:// 手指按下时的坐标            // X 轴坐标变化 Y轴坐标没有变化            startX = (int) event.getX();            break;        case MotionEvent.ACTION_MOVE:// 手指移动时的处理            int newX = (int) event.getX();            int dX = newX - startX;            distance += Math.abs(dX);// 滑动的距离            l += dX;            flushView();            startX = newX;            break;        case MotionEvent.ACTION_UP:            if (distance > 1) {                isClick = false;                distance = 0;            }            if (!isClick) {                if (l <= lEFT / 2) {                    open = false;                } else {                    open = true;                }                flushState();            }            break;        }        return super.onTouchEvent(event);    }    /**     * move 移动时刷新view     */    public void flushView() {        if (l < 0) {            l = 0;        } else if (l > lEFT) {            l = lEFT;        }        invalidate();    }    /**     * up 抬起时刷新状态 开 关     */    public void flushState() {        if (open) {            l = lEFT;        } else {            l = 0;        }        if (listener != null) {            listener.onCheckedChanged(SwitchView.this, open);        }        invalidate();    }    /**     * 设置测量的规则     */    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        // 设置控件的大小        setMeasuredDimension(backgroundBitmap.getWidth(),                backgroundBitmap.getHeight());//    }    /**     * 绘制控件     */    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.drawBitmap(backgroundBitmap, 0, 0, null);// 绘制选择按钮的背景        // canvas.drawBitmap(slideBitmap, lEFT, 0, null);//绘制滑块图片 开的状态        canvas.drawBitmap(slideBitmap, l, 0, null);// 绘制滑块图片状态        /*         * if (open) { canvas.drawBitmap(slideBitmap, lEFT, 0, null);// 开的状态 }         * else { canvas.drawBitmap(slideBitmap, 0, 0, null);// 关的状态         *          * }         */    }}
  • 自定义属性
  • 这里写代码片

0 0