自定义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等众多控件,但是,有时候在项目开发过程中,还是需要开发者自定义一些需要 ...
随机推荐
- 为新项目添彩的 10+ 超有用 JavaScript 库
快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中. <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...
- Codility---Nesting
Task description A string S consisting of N characters is called properly nested if: S is empty; S h ...
- js中prototype与__proto__区别
proto(隐式原型)与prototype(显式原型) 显式原型 explicit prototype property:每一个函数在创建之后都会拥有一个名为prototype的属性,这个属性指向函数 ...
- Adobe cs6 全系列软件绿色破解版-一键安装
下载地址: 链接:https://pan.baidu.com/s/1THssmSS-SnyNc2DW7Wr8cA 提取码:y3tq 软件介绍 作为全球领先的多媒体设计软件供应商,Adobe Syste ...
- shell多线程(3)while循环
start="2018-06-17" end="2018-07-01" min=`date -d "${start}" +%Y%m%d` m ...
- Jenkins持续部署-自动生成版本号
目录 Jenkins持续部署-自动生成版本号 目录 前言 目的 详细流程 获取SVN Reversion 获取需求号 设置编译前读取版本号 总结 参考文献 Jenkins持续部署-自动生成版本号 目录 ...
- python trojan development 3rd —— use python to creative a simple shell
前两篇文章的木马太被动,今天是通过socket和os来进行主动木马编写 有些s13,我真的搞不懂拿一些没过脑子的代码就放到网上去害人,骗流量,还某知名安全企业学院写的,真的服.我的代码自己运行过,很稳 ...
- Storm 学习之路(三)—— Storm单机版本环境搭建
1. 安装环境要求 you need to install Storm’s dependencies on Nimbus and the worker machines. These are: Jav ...
- Mui a 链接失效的解决办法
方法一: mui('body').on('tap', 'a', function() { if(this.href){ //判断链接是否存在 location.href = this.href; ...
- JavaWeb入门_模仿天猫整站Tmall_SSH实践项目
Tmall_SSH 技术栈 Struts2 + Hibernate + Spring + Jsp + Tomcat , 是 Java Web 入门非常好的练手项目 效果展示: 模仿天猫前台 模仿天猫后 ...