自定义View之开关
资源文件
首先我们需要有两个图片文件,分别是开关的背景和开关的滑块
自定义View
1.写一个类继承View
2.copy该类的全路径名在布局文件使用,
3.找到这个控件,设置初始信息
4.根据需求绘制这个界面内容
/**
 * Created by Administrator on 2017/9/12 0012.
 * email: apk2sf@163.com
 * QQ:337081267
 */
public class MyToggleView extends View {
    private Bitmap mSwitchBackgroundBitmap;
    private Paint mPaint;
    private Bitmap mSlideSourceBitmap;
    private boolean mToogleState;
    private float mCurrentX;
    private boolean isTouchMove;
    private OnStateChangeListener mStateChangeListener;
    public MyToggleView(Context context) {
        this(context, null);
    }
    public MyToggleView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public MyToggleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //创建一个画笔
        mPaint = new Paint();
    }
    /**
     * 添加背景
     *
     * @param switchBackground
     */
    public void setSwitchBackground(int switchBackground) {
        //把文件变为Bitmap
        mSwitchBackgroundBitmap = BitmapFactory.decodeResource(getResources(), switchBackground);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //测量的方法
        setMeasuredDimension(mSwitchBackgroundBitmap.getWidth(), mSwitchBackgroundBitmap.getHeight());
    }
    @Override
    protected void onDraw(Canvas canvas) {
        //绘制的方法
        canvas.drawBitmap(mSwitchBackgroundBitmap, 0, 0, mPaint);
        //判断是否是手指在滑动
        if (isTouchMove) {
            float newLeft = mCurrentX - mSlideSourceBitmap.getWidth() / 2;
//            canvas.drawBitmap(mSlideSourceBitmap, newLeft, 0, mPaint);
            int maxLeft = mSwitchBackgroundBitmap.getWidth()
                    - mSlideSourceBitmap.getWidth();
            // 限定滑块范围
            if (newLeft < 0) {
                newLeft = 0; // 左边范围
            } else if (newLeft > maxLeft) {
                newLeft = maxLeft; // 右边范围
            }
            canvas.drawBitmap(mSlideSourceBitmap, newLeft, 0, mPaint);
        } else {
            if (mToogleState) {
                canvas.drawBitmap(mSlideSourceBitmap, getWidth() - mSlideSourceBitmap.getWidth(), 0, mPaint);
            } else {
                canvas.drawBitmap(mSlideSourceBitmap, 0, 0, mPaint);
            }
        }
        super.onDraw(canvas);
    }
    /**
     * 设置滑块响应触摸事件
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mCurrentX = event.getX();
                isTouchMove = true;
                break;
            case MotionEvent.ACTION_UP:
                mCurrentX = event.getX();
                isTouchMove = false;
                //根据抬起的位置设置开关值
                mToogleState = mCurrentX > mSwitchBackgroundBitmap.getWidth() / 2;
                //设置监听
                if (mStateChangeListener != null) {
                    mStateChangeListener.onStateChangeListener(mToogleState);
                }
                break;
            case MotionEvent.ACTION_MOVE:
                mCurrentX = event.getX();
                break;
            default:
                break;
        }
        Log.e("MyToggleView", "MyToggleView onTouchEvent()" + mCurrentX);
        invalidate();
        return true;
    }
    /**
     * 设置滑块
     *
     * @param slideSource
     */
    public void setSlideSource(int slideSource) {
        mSlideSourceBitmap = BitmapFactory.decodeResource(getResources(), slideSource);
    }
    /**
     * 设置开关状态
     *
     * @param toogleState
     */
    public void setToogleState(boolean toogleState) {
        mToogleState = toogleState;
    }
    public void setOnStateChangeListener(OnStateChangeListener onStateChangeListener) {
        this.mStateChangeListener = onStateChangeListener;
    }
    /**
     * 设置监听接口
     */
    public interface OnStateChangeListener {
        void onStateChangeListener(boolean toogleState);
    }
}
												
											自定义View之开关的更多相关文章
- Android -- 自定义view实现keep欢迎页倒计时效果
		
1,最近打开keep的app的时候,发现它的欢迎页面的倒计时效果还不错,所以打算自己来写写,然后就有了这篇文章. 2,还是老规矩,先看一下我们今天实现的效果 相较于我们常见的倒计时,这次实现的效果是多 ...
 - Android简易实战教程--第二十七话《自定义View入门案例之开关按钮详细分析》
		
转载此博客请注明出处点击打开链接 http://blog.csdn.net/qq_32059827/article/details/52444145 对于自定义view,可能是一个比较大的 ...
 - Android 自定义 View 绘制
		
在 Android 自定义View 里面,介绍了自定义的View的基本概念.同时在 Android 控件架构及View.ViewGroup的测量 里面介绍了 Android 的坐标系 View.Vie ...
 - 手机安全卫士——在设置中心  自定义view和自定义属性
		
自定义组合控件 1. 自定义一个View, 继承ViewGroup,比如RelativeLayout,此文中是SettingItemView 2. 编写组合控件的布局文件,在自定义的View中加载 ...
 - Android进阶之绘制-自定义View完全掌握(四)
		
前面的案例中我们都是使用系统的一些控件通过组合的方式来生成我们自定义的控件,自定义控件的实现还可以通过自定义类继承View来完成.从该篇博客开始,我们通过自定义类继承View来实现一些我们自定义的控件 ...
 - android开发之自定义View 详解 资料整理 小冰原创整理,原创作品。
		
2019独角兽企业重金招聘Python工程师标准>>> /** * 作者:David Zheng on 2015/11/7 15:38 * * 网站:http://www.93sec ...
 - 自定义View之Canvas使用
		
自定义View的绘制流程一般都是这样:提前创建好Paint对象,重写onDraw(),把绘制代码卸载ondraw()里面,大致如下: Paint paint = new Paint(); @Overr ...
 - 自定义view(一)
		
最近在学习自定义view 一遍看一别学顺便记录一下 1.View的测量-------->onMeasure() 首先,当我们要画一个图形的时候,必须知道三个数据:位置,长度,宽度 才能确定 ...
 - Android 自定义View及其在布局文件中的使用示例
		
前言: 尽管Android已经为我们提供了一套丰富的控件,如:Button,ImageView,TextView,EditText等众多控件,但是,有时候在项目开发过程中,还是需要开发者自定义一些需要 ...
 
随机推荐
- Docker Explanation and Apache Image
			
https://blog.sajjan.com.np/2017/02/05/docker-getting-started-containers-ubuntu/ https://blog.sajjan. ...
 - [Erlang-0015][Lager] Erlang日志框架Lager简析
			
项目地址:https://github.com/basho/lager (欢迎任何形式的转载,但请务必注明出处:http://www.cnblogs.com/liangjingyang)
 - MySql 小内存优化
			
MySql5.6启动内存近500M,如在小型机内存敏感的环境可能较大,下边配置会减少较多内存,至150M以下. performance_schema = OFF innodb_buffer_pool_ ...
 - HTML连载14-文字属性补充&简写
			
一.字体属性(补充) 1.如果设置的字体不存在,那么系统会使用默认的字体来显示宋体. font-family:"瞎写的一个字体"; 2.如果设置的字体不存在,而我们又不想用默认的字 ...
 - 点菜网---Java开源生鲜电商平台-技术选型(源码可下载)
			
点菜网---Java开源生鲜电商平台-技术选型(源码可下载) 1.内容简介 点菜网目前选用的是最流行的微服务架构模式,采用前后端分离的开发模式,具备高可用,高负载,支持千万级别的数据量的请求. 2. ...
 - 【设计模式】结构型03外观模式(Facade Pattern)
			
[设计模式]结构型02装饰模式(Decorator Pattern) 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问 ...
 - android开发环境配置和一些坑
			
要开发安卓应用,首先就是要配置安卓的开发环境. 新手在这个步骤时,会发现安卓的开发环境配置不是一般的麻烦,因为一般人是选择eclipse+a sdk+adt的,需要java环境,需要翻 墙,需要有非一 ...
 - 2018.8.17 2018暑假集训 关于dp的一些感想(以目前的知识水平)
			
学了这么长时间的dp似乎还是不怎么样 谨以此篇文字记录一年以来与dp斗智斗勇的各种经历 关于dp(也就是动态规划)似乎对于每个OIer来说都是一个永远的噩梦. 刚刚开始学dp的时候完全搞不明白(只是觉 ...
 - web前端css(二)
			
一. 标准文档流 标准文档流中会有一些现象: 空白折叠 和 高低不齐边底对齐的现象 标准文档流等级森严, 标签分为两种等级: 行内元素 和 块级元素. 1. 行内元素 和 块级元素的区别: 行内元素 ...
 - java LineNumberReader的使用
			
前段时间需要读报表打印,需求是可以从第N行读到第N行,发现百度出来的LineNumberReader方法都不怎么理想 然后就找到一篇和众百度里脱颖而出的好文章,所以分享之: 从类 的命名来看,貌似 ...