自定义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等众多控件,但是,有时候在项目开发过程中,还是需要开发者自定义一些需要 ...
随机推荐
- delphi多版本安装方法
delphi tokyo和其他版本并存的安装方法 1.安装delphi 10.2 tokyo 破解后写入D:\Program Files (x86)\Embarcadero\Studio\19.0\b ...
- C++没有库则寸步难行,有库则几乎可以做任何事情——Bjarne Stroustrupi
"Without a good library, most interesting tasks are hard to do in C++; but given a good library ...
- QML于C++交互之信号与槽(signal&slot )
connect c++ SIGNAL with QML SLOT 简介 QML 与 C++ 混合编程时,总结了一下qml和c++互相直接调用.及信号与槽连接 的几种情况,详细使用情况看示例代码 所有的 ...
- 80%的岗位是没有太多能力上的要求的(少部分聪明的人开始觉醒,这部分一定是那些主动追求、主动学习的人;30岁现象能区分真正专业和不学无术的人)good
不要沦陷程序员的30岁问题 热门> 就是学习能力和工作热情态度的问题. 我之前也跟作者一样思考过这个问题,答案是否定的. 在知识积累的行业,年纪越大,越吃香,比如金融,医学,IT.就怕3 ...
- 全面解析ECMAScript 6模块系统
快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中. <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...
- Web性能优化分析
如果你的网站在1000ms内加载完成,那么会有平均一个用户停留下来.2014年,平均网页的大小是1.9MB.看下图了解更多统计信息. 直击现场 <HTML开发MacOSApp教程> ht ...
- javaweb各种框架组合案例(三):maven+spring+springMVC+hibernate
1.hibernate译为"越冬",指的是给java程序员带来春天,因为java程序员无需再关心各种sql了: 2.hibernate通过java类生成数据库表,通过操作对象来映射 ...
- PWN菜鸡入门之栈溢出(1)
栈溢出 一.基本概念: 函数调用栈情况见链接 基本准备: bss段可执行检测: gef➤ b main Breakpoint at . gef➤ r Starting program: /mnt/ ...
- 【过时】update progress has encountered a problem解决办法
笔者第二次整理博客,已经抛弃MyEclipse了,我将公司项目转换成了idea的目录结构后大家都改换Idea进行开发,虽然我个人比较喜欢eclipse的简洁干净,但是Idea的确有很多方便开发的新功能 ...
- (数据科学学习手札65)利用Python实现Shp格式向GeoJSON的转换
一.简介 Shp格式是GIS中非常重要的数据格式,主要在Arcgis中使用,但在进行很多基于网页的空间数据可视化时,通常只接受GeoJSON格式的数据,众所周知JSON(JavaScript Obje ...