[android] 切换按钮-自定义控件-拖动效果
重写View的onTouchEvent()方法,传递进来MotionEvent对象
调用MotionEvent对象的getAction()方法,获取当前动作
switch判断一下当前动作
事件为MotionEvent.ACTION_DOWN是手指第一次触摸屏幕
事件为MotionEvent.ACTION_MOVE是手指在屏幕上移动
事件为MotionEvent.ACTION_UP是手指离开屏幕
当手指触摸到屏幕
定义手指最后的坐标lastX
调用MotionEvent对象的getX() 方法,得到lastX的值
当手指在屏幕上移动
定义手指横向移动的距离dis
调用getX()-lastX就是移动的距离
定义滑动按钮的左边就是这个移动的距离
判断slideBtnLeft位于合理的位置,0到背景图的宽度-滑动按钮的宽度
调用invalidate()方法,刷新视图
onClick事件和onTouchEvent是有冲突
定义一个标志isDrag变量,如果有拖动发生,就把这个变量赋值true
在onCllick()方法里面对这个变量进行判断
当手指抬起的时候
判断当前slideBtnLeft来确定当前按钮是开还是关的状态
slideBtnLeft比较 maxLeft的一半就能判断当前状态
package com.tsh.myswitchbtn; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener; public class MyToggleBtn extends View implements OnClickListener {
//背景图片
private Bitmap bitmapBackground;
//按钮图片
private Bitmap bitmapBtn;
private Paint paint;
/**
* 布局文件中使用
* @param context
* @param attrs
*/
public MyToggleBtn(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
/**
* 初始化view
*/
private void initView() {
bitmapBackground=BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
bitmapBtn=BitmapFactory.decodeResource(getResources(), R.drawable.slide_button);
paint=new Paint();
paint.setAntiAlias(true);
//点击事件
setOnClickListener(this);
}
/**
* 计算大小
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(bitmapBackground.getWidth(), bitmapBackground.getHeight());
}
//当前状态
private boolean currentState=false;
//滑动按钮的当前left
private float slideBtnLeft=0;
/**
* 绘制view
*/
@Override
protected void onDraw(Canvas canvas) {
//绘制背景
canvas.drawBitmap(bitmapBackground, 0, 0, paint);
//绘制滑动按钮
canvas.drawBitmap(bitmapBtn, slideBtnLeft, 0, paint);
}
private boolean isDrag=false;
/**
* 点击事件
*/
@Override
public void onClick(View v) {
//解决与移动事件的冲突
if(!isDrag){
currentState = !currentState;
flushState();
} } private int lastX;
/**
* 触摸事件
*/
private int firstX;
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch(event.getAction()){
//手指按下
case MotionEvent.ACTION_DOWN:
firstX=lastX=(int) event.getX();
isDrag=false;
break;
//手指移动
case MotionEvent.ACTION_MOVE:
//解决与点击事件冲突
if(Math.abs(event.getX()-firstX)>5){
isDrag=true;
} int dis=(int) event.getX()-lastX;
slideBtnLeft=slideBtnLeft+dis;
lastX=(int) event.getX();
break;
//手指抬起
case MotionEvent.ACTION_UP:
if(isDrag){
int maxLeft = bitmapBackground.getWidth()
- bitmapBtn.getWidth();
if (slideBtnLeft >= maxLeft / 2) {
currentState = true;
} else {
currentState = false;
}
flushState();
}
break;
}
flushView(); return true;
}
/**
* 刷新状态
*/
private void flushState() {
if (currentState == true) {
slideBtnLeft = bitmapBackground.getWidth()
- bitmapBtn.getWidth();
} else {
slideBtnLeft = 0;
}
invalidate();
}
/**
* 刷新视图
*/
private void flushView() {
int maxLeft=bitmapBackground.getWidth()-bitmapBtn.getWidth();
slideBtnLeft=(slideBtnLeft>0) ? slideBtnLeft : 0;
slideBtnLeft=(slideBtnLeft<maxLeft) ? slideBtnLeft:maxLeft;
invalidate();
}
}
[android] 切换按钮-自定义控件-拖动效果的更多相关文章
- [android] 切换按钮-自定义控件
准备两张图片,按钮背景,上面的小开关 创建一个类MyToggleBtn,继承View 实现三个构造方法,传递上下文, 实现构造方法,传递Context对象,在java代码中实例化时主要使用这个 实现构 ...
- Android 浮动按钮的伸缩效果
在做项目时想增加点动感,于是就有如下效果: 实现起来也很简单,通过属性动画和recyclerview 滑动结合就很好实现了. 通过给recycleview添加一个滑动监听:通过滚动的差值来处理动画 m ...
- Android实现按钮点击效果(第一次点击变色,第二次恢复)
1.首先创建一个按钮 <Button android:id="@+id/click" android:layout_width="fill_parent" ...
- Android 仿 窗帘效果 和 登录界面拖动效果 (Scroller类的应用) 附 2个DEMO及源码
在android学习中,动作交互是软件中重要的一部分,其中的Scroller就是提供了拖动效果的类,在网上,比如说一些Launcher实现滑屏都可以通过这个类去实现.下面要说的就是上次Scroller ...
- Android中使用ImageViewSwitcher实现图片切换轮播导航效果
前面写过了使用ViewFlipper和ViewPager实现屏幕中视图切换的效果(ViewPager未实现轮播)附链接: Android中使用ViewFlipper实现屏幕切换 Android中使用V ...
- android 按钮点击效果实现
在其他人的博客里看到其实实现按钮点击效果的方法有很多,这里提到的只是其中一个办法 图片素材(我自己用截图截的,可以自己搞) 放到mipmap目录下(studio是在这个目录下 , eclipse 直接 ...
- Android切换页面效果的实现二:WebView+ViewPager
前言: 由于第一种切换页面的效果不能满足项目的要求,于是又找到另外一种更简单好用的方法来实现,顿时感觉,做项目开发,找到一种合适的方法能够减少很多时间,(刚开始自己弄的时候还想着自己写手势识别的方法呢 ...
- Android 仿 窗帘效果 和 登录界面拖动效果 (Scroller类的应用) 附 2个DEMO及源代码
在android学习中,动作交互是软件中重要的一部分.当中的Scroller就是提供了拖动效果的类,在网上.比方说一些Launcher实现滑屏都能够通过这个类去实现.以下要说的就是上次Scroller ...
- Android长按及拖动事件探究
Android中长按拖动还是比较常见的.比如Launcher中的图标拖动及屏幕切换,ListView中item顺序的改变,新闻类App中新闻类别的顺序改变等.下面就这个事件做一下分析. 就目前而言,A ...
随机推荐
- 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象
本文需要对C#里的LINQ.Lambda 表达式 .委托有一定了解. 在工作中,经常遇到需要对比两个集合的场景,如: 页面集合数据修改,需要保存到数据库 全量同步上游数据到本系统数据库 在这些场景中, ...
- C# 不能用于文件名的字符
在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符 那么具体是包括哪些符号不能作为文件名? Tilde (~) Numbe ...
- Asp .Net core 2 学习笔记(3) —— 静态文件
这个系列的初衷是便于自己总结与回顾,把笔记本上面的东西转移到这里,态度不由得谨慎许多,下面是我参考的资源: ASP.NET Core 中文文档目录 官方文档 记在这里的东西我会不断的完善丰满,对于文章 ...
- 第一章 在.net mvc生成EF入门
一. 打开Visual Studio 2017(我使用的是2017) 新建一个mvc项目 命名为StudentEntity 二.1)建立完项目后在项目中右击选择新建项,找到ADO.NET实体数据模型 ...
- BZOJ NOIP提高组十连测第一场
今天的题目一共拿了$180$分,感觉自己还是太菜了,二三两题只能骗到部分分 1.$String\ Master$ 题目大意:有两个字符串,在允许k次失配的情况下,求最长公共子串的长度 没什么好讲,直接 ...
- windows中eclipse调试hadoop
下载eclipse:https://www.eclipse.org/downloads/eclipse-packages 下载hadoop eclipse插件:https://github.com/w ...
- 浏览器内核、渲染引擎、JS引擎简介
一.定义 浏览器内核分成两部分:渲染引擎和JS引擎. 由于JS引擎越来越独立,浏览器内核 就倾向于 单指 渲染引擎. 渲染引擎是一种对HTML文档进行解析并将其显示在页面上的工具.(说白了,就是按照 ...
- Hadoop 2.4.1+HBase 0.98.6.1 分布式安装
参考:http://blog.csdn.net/wind520/article/details/39856353
- C#:使用ListView动态添加数据一直闪烁的解决办法
首先,自定义一个类ListViewNF,继承自 System.Windows.Forms.ListView using System; using System.Collections.Generic ...
- C++ 操作符、局部 全局变量及自动转换原则
1.&:表示与操作,eg:2&1=2&&:表示and操作,eg:1&&0=0|:表示或操作,eg:2|1=3||:表示or操作,eg:1||0=12.全 ...