自定义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等众多控件,但是,有时候在项目开发过程中,还是需要开发者自定义一些需要 ...
随机推荐
- RapidJSON 1.0 正式版发布,C++的JSON开发包
分享 <关于我> 分享 [中文纪录片]互联网时代 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...
- 使用VS将 XML/Json 转为Model Class文件
环境: VS2015 Win10 XML例子: <OTA_GetRerStatusRQ EchoToken=" B3BB9248255BD851AC94" UserNam ...
- WebRequest请求错误(服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF)
WebRequest请求错误(服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF)解决办法,天津config文件,增加一个配置如下 <?x ...
- Unity 入門 - 延遲解析
本文大纲: 小引 共享的范例代码 使用 Lazy<T> 使用自动工厂 注入自定义工厂 小引 当我们说「解析某个型别/组件」时,意思通常是呼叫某类别的建构函式,以建立其实例(instance ...
- 【Web前端Talk】“用数据说话,从埋点开始”-带你理解前端的三种埋点
埋点到底是什么呢? 引用自百科的原话是,埋点分析网站分析的一种常用的数据采集方法.因此其本质是分析,但是靠什么分析呢?靠埋点得到的数据.通俗来讲,就是当我想要在某个产品上得到用户的一些行为数据用来分析 ...
- SYN5104型 时间综合测试仪
SYN5104型 时间综合测试仪 gps时钟测试仪时间/频率测量仪器使用说明视频链接: http://www.syn029.com/h-pd-73-0_310_6_-1.html 请将此链接复制到浏 ...
- 剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染
一.概述 1.1 数字人类的概要 数字人类(Digital Human)是利用计算机模拟真实人类的一种综合性的渲染技术.也被称为虚拟人类.超真实人类.照片级人类. 它是一种技术和艺术相结合的综合性模拟 ...
- IOS 数据存储(NSKeyedArchiver 归档篇)
什么是归档 当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流NSData类型数据,再通过写入文件来进行存储. 归档的作用 之前将数据存储到本地,只能是字符串.数组.字 ...
- AI行为树的工作原理
很久没写博客了,最近在项目刚部署到测试服,需要进行压测,老大相当专业的用了行为树来组织压测机器人的代码,这段时间陆陆续续在网上看了不少关于行为树的文章,其中有一篇我觉得写得非常到位,它原文是英文,链接 ...
- Git 本地仓库(使用小乌龟进行操作,一个人开发)
一.首先在本地创建版本库 创建成功最明显的特征是该目录下存在一个隐藏文件夹(.git) 前提:已设置显示隐藏文件 三种方式: 1.Git GUI Here(右击) 2.Git Bash Here(右击 ...