自定义控件之自定义开关

本文介绍了一种自定义Android开关控件的方法。通过继承View并重写关键方法,利用Bitmap绘制背景和滑块,结合触摸事件实现了开关状态的切换。文章提供了完整的代码示例及布局文件。
自定义开关设计原理:
自定义一个类继承View,重写构造方法,(主要重写两个参数的构造方法,这个方法会在初始化布局的时候调用)
在布局中调用该类。
为类中的各类小控件设计点击事件。
、、、、、、、、、、、、、、、、、、、、、、、
先上类openView:
package com.example.open_off;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by yang on 2017/7/4.
 */

public class OpenView extends View implements View.OnClickListener {
    private Bitmap backgroundbitmap;
    private Bitmap slidebitmap;
    private Paint paint;
    private int slideleft;
    private int maxleft;
    private boolean isopen=false;
    private boolean isclickable=true;

    public OpenView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);

    }
    

    public OpenView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }


    public OpenView(Context context) {
        super(context);
        init(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(backgroundbitmap.getWidth(),backgroundbitmap.getHeight());
    }

    @Override
    protected void onDraw(Canvas canvas) {

        canvas.drawBitmap(backgroundbitmap,0,0,paint);
        canvas.drawBitmap(slidebitmap,slideleft,0,paint);

        //super.onDraw(canvas);
    }

    private void init(Context context) {
        paint=new Paint();
        paint.setColor(Color.GREEN);
        paint.setAntiAlias(true);
        backgroundbitmap= BitmapFactory.decodeResource(getResources(),R.drawable.switch_background);
        slidebitmap= BitmapFactory.decodeResource(getResources(),R.drawable.slide_button);
        maxleft=backgroundbitmap.getWidth()-slidebitmap.getWidth();
        slideleft=0;

       setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        if (isclickable){
            if (isopen){
                //变成关
                slideleft=0;

            }else {
                //变成开
                slideleft=maxleft;
            }
            isopen=!isopen;
            invalidate();
        }
    }
    int startX=0;
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        switch (event.getAction()){
            //按下
            case MotionEvent.ACTION_DOWN:
                startX= (int) event.getRawX();
                break;
            //移动
            case MotionEvent.ACTION_MOVE:
                int  endX= (int) event.getRawX();
                int dx=endX-startX;
                if (dx<10){
                    isclickable=true;
                }else {
                    isclickable=false;
                }
                slideleft+=dx;
                if (slideleft<0){
                    slideleft=0;
                }
                if (slideleft>maxleft){
                    slideleft=maxleft;
                }
                invalidate();
                startX=endX;
                break;
            //离开
            case MotionEvent.ACTION_UP:

                if (slideleft>maxleft/2){
                    slideleft=maxleft;
                }else {
                    slideleft=0;
                }
                invalidate();
                break;
        }

        return true;
    }
}

再上我们的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.open_off.MainActivity">
//调用该类
    <com.example.open_off.OpenView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        />
</RelativeLayout>

最后上效果图:

操作效果:
点击切换,滑动切换:
滑动冲突的解决方式:
int  endX= (int) event.getRawX();
int dx=endX-startX;
if (dx<10){
    isclickable=true;
}else {
    isclickable=false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值