自定义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等众多控件,但是,有时候在项目开发过程中,还是需要开发者自定义一些需要 ...
随机推荐
- 写一个可拖动的 TShape(简单有效:依靠VCL体系,TShape自己就能被探测到被点击了,然后只要改变Left坐标就行了)
问题来源: http://www.cnblogs.com/del/archive/2009/03/09/1234066.html#1471535 本例效果图: 自定义类(TMyShape)单元 : u ...
- 用CMake 构建Qt 项目
译:用CMake构建Qt项目作者: Johan Thelin 译者:赖敬文原链接:http://developer.qt.nokia.com/quarterly/view/using_cmake_t ...
- 【Linux】Linux下设备网卡以及硬件管理等
这是Linux下网络硬件管理的基础知识,虽然平时用到的可能比软件的少一点,但是作为基础命令,还是需要记住,以免用时又得查询. 本文参考官方文档:https://wiki.ubuntu.com.cn/% ...
- 04-MySQL中的数据类型
1 整体说明MYsql的数据类型#1. 数字: 整型:tinyint int bigint 小数: float :在位数比较短的情况下不精准 double ...
- Netty源码分析--创建Channel(三)
恩~,没错,其实这一篇才是真正的开始分析源码,你打我呀~. 先看一下我Netty的启动类 private void start() throws Exception { EventLoopGroup ...
- PWN 菜鸡入门之 shellcode编写 及exploid-db用法示例
下面我将参考其他资料来一步步示范shellcode的几种编写方式 0x01 系统调用 通过系统调用execve函数返回shell C语言实现: #include<unistd.h> #in ...
- Spring Boot 教程
Spring Boot 系列教程: Spring Boot:快速入门教程 Spring Boot:整合Swagger文档 Spring Boot:整合MyBatis框架 Spring Boot:实现M ...
- Scala 学习之路(十一)—— 模式匹配
一.模式匹配 Scala支持模式匹配机制,可以代替swith语句.执行类型检查.以及支持析构表达式等. 1.1 更好的swith Scala不支持swith,可以使用模式匹配match...case语 ...
- mvc中的表现和数据分离怎么理解?
使用过 JavaScript框架(如 AngularJS, Backbone)的人都很熟悉在UI(用户界面,前端)中mvc的工作机理.这些框架实现了MVC,使得在一个单页面中实现根据需要变化视图时更加 ...
- 搭建minima主题的github博客网站
layout: post title: "搭建minima主题的github博客网站" date: 2019-04-20 19:20:20 +0800 --- 作者:吴甜甜 个人博 ...