自制控件1 开关按钮

本文介绍了如何制作一个自定义的开关按钮,包括思路整理、图片准备、滑动监听、位置处理和回调接口的实现。通过继承View,利用onTouchEvent和onDraw方法,实现了开关按钮的滑动效果和状态控制。
摘要由CSDN通过智能技术生成

版权声明:本文出自 双门M 的专栏,转载或使用请注明出处。

自定义控件——初识自定义控件里面,我们已经大致介绍三种自定义控件,分别是
* 自制控件
* 组合控件
* 拓展控件

并且,我们已经对自制控件就继承自View和继承自ViewGroup进行了分析和最简单deme展示。

熟能生巧,接下的几篇文章,我们依然来进行自制控件。
在本篇里面,我们来进行自制简单的开关按钮。

有图有真相,先看一下最终的效果图。

效果.gif

马上开工。

一、思路整理

从上面的图片中,我们看出,这个自定义控件涉及到3张图片,1张是黑色背景,1张是白色背景,另外一张就是一个圆形球的图片。

思路:弄一个类继承自View,比如叫做DiyToggleView,利用onDraw()方法里面,控制着三张图片在对应的时刻显示对应的图片。

我们触摸球状图片的时候,这张图片会动起来,所以需要用到onTouchEvent,然后在这里面进行MotionEvent.ACTION_DOWN、MotionEvent.ACTION_MOVE和MotionEvent.ACTION_UP的判断

在DiyToggleView里面,弄一些方法和回调接口给控件的使用者使用。

大概思路已经整理好了,现在开工。

二、准备三张图片,然后在在继承自View的自定义控件里面做出一个最简单的开关的样子

.
.

1、准备3张图片

球.png

关闭背景.png

打开背景.png

2、画上简单的开关样子

这个开关我们继承自View,然后复写三个构造方法。

其实说到底,我们这个开关的自定义流程就是弄3个Bitmap,然后对点击和滑动进行监听,根据滑动的位置控制Bitmap是否显示。

既然思路摆在这里,那么我们就先在onDraw画上一个开关的样子。

DiyToggleView

public class DiyToggleView extends View {
   
    private Bitmap toggleBall;
    private Bitmap toggleOnBg;
    private Bitmap toggleOffBg;
    public DiyToggleView(Context context) {
        super(context);
    }
    public DiyToggleView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public DiyToggleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    /**
     * 设置开关的滑动的球
     * @param resId
     */
    public void setToggleBallBitmap(int resId) {
        toggleBall = BitmapFactory.decodeResource(getResources(), resId);
    }
    /**
     * 设置开关的打开状态的背景
     * @param resId
     */
    public void setToggleOnBgBitmap(int resId){
        toggleOnBg = BitmapFactory.decodeResource(getResources(),resId);
    }
    /**
     * 设置开关关闭状态的背景
     * @param resId
     */
    public void setToggleOffBgBitmap(int resId){
        toggleOffBg = BitmapFactory.decodeResource(getResources(),resId);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if(toggleOnBg != null){
            canvas.drawBitmap(toggleOnBg, 0, 0, null);
        }
        if(toggleBall != null){
            canvas.drawBitmap(toggleBall,0,0,null);
        }

    }
    // 我们需要精确控制这个开关的大小,所以必须复写onMeasure方法
    // 在onMeasure里面精确控制大小用到的是  setMeasuredDimension 这个方法
    // 假设不复写控制的大小,那么这个自动自定义View即使宽高都为wrap_content也会占据全屏
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int measureWidth = toggleOnBg.getWidth();
        int measureHeight = toggleOnBg.getHeight();
        setMeasuredDimension(measureWidth,measureHeight);  // 控制View的大小的关键方法
    }

}

.
.
MainActivity

public class MainActivity extends Activity {
   
    private DiyToggleView mDtv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDtv = (DiyToggleView) findViewById(R.id.mDtv);
        mDtv.setToggleBall
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值