android 拖动按钮
引用:http://blog.sina.com.cn/s/blog_80723de80100vqln.html
首先效果图:
然后是分别建立三个文件,第一个是main.class,第二个是SlipButton.class,第三个是 onchangeListener.class
main.class
import Android.app.Activity;
import Android.os.Bundle;
import Android.widget.Toast;
public class Main extends Activity implements OnChangedListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SlipButton myBtn =(SlipButton) findViewById(R.id.slipBtn);//获得指定控件
myBtn.SetOnChangedListener(this);//为控件设置监听器
}
@Override
public void OnChanged(boolean CheckState) {//当按钮状态被改变时
// TODO Auto-generated method stub
if(CheckState)
Toast.makeText(this,"打开了..." , Toast.LENGTH_SHORT).show();
else
Toast.makeText(this,"关闭了..." , Toast.LENGTH_SHORT).show();
}
}
SlipButton.class
import Android.content.Context;
import Android.graphics.Bitmap;
import Android.graphics.BitmapFactory;
import Android.graphics.Canvas;
import Android.graphics.Matrix;
import Android.graphics.Paint;
import Android.graphics.Rect;
import Android.util.AttributeSet;
import Android.view.MotionEvent;
import Android.view.View;
import Android.view.View.OnTouchListener;
public class SlipButton extends View implements OnTouchListener{
private boolean NowChoose = false;//记录当前按钮是否打开,true为打开,flase为关闭
private boolean OnSlip = false;//记录用户是否在滑动的变量
private float DownX,NowX;//按下时的x,当前的x,
private Rect Btn_On,Btn_Off;//打开和关闭状态下,游标的Rect
private boolean isChgLsnOn = false;
private OnChangedListener ChgLsn;
private Bitmap bg_on,bg_off,slip_btn;
public SlipButton(Context context) {
super(context);
// TODO Auto-generated constructor stub
init();
}
public SlipButton(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
init();
}
private void init(){//初始化
//载入图片资源
bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.slip_bg_on);
bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.slip_bg_off);
slip_btn = BitmapFactory.decodeResource(getResources(), R.drawable.slip_btn);
//获得需要的Rect数据
Btn_On = new Rect(0,0,slip_btn.getWidth(),slip_btn.getHeight());
Btn_Off = new Rect(
bg_off.getWidth()-slip_btn.getWidth(),
0,
bg_off.getWidth(),
slip_btn.getHeight());
setOnTouchListener(this);//设置监听器,也可以直接复写OnTouchEvent
}
@Override
protected void onDraw(Canvas canvas) {//绘图函数
// TODO Auto-generated method stub
super.onDraw(canvas);
Matrix matrix = new Matrix();
Paint paint = new Paint();
float x;
{
if(NowX<(bg_on.getWidth()/2))//滑动到前半段与后半段的背景不同,在此做判断
canvas.drawBitmap(bg_off,matrix, paint);//画出关闭时的背景
else
canvas.drawBitmap(bg_on,matrix, paint);//画出打开时的背景
if(OnSlip)//是否是在滑动状态,
{
if(NowX >= bg_on.getWidth())//是否划出指定范围,不能让游标跑到外头,必须做这个判断
x = bg_on.getWidth()-slip_btn.getWidth()/2;//减去游标1/2的长度...
else
x = NowX - slip_btn.getWidth()/2;
}else{//非滑动状态
if(NowChoose)//根据现在的开关状态设置画游标的位置
x = Btn_Off.left;
else
x = Btn_On.left;
}
if(x<0)//对游标位置进行异常判断...
x = 0;
else if(x>bg_on.getWidth()-slip_btn.getWidth())
x = bg_on.getWidth()-slip_btn.getWidth();
canvas.drawBitmap(slip_btn,x, 0, paint);//画出游标.
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch(event.getAction())//根据动作来执行代码
{
case MotionEvent.ACTION_MOVE://滑动
NowX = event.getX();
break;
case MotionEvent.ACTION_DOWN://按下
if(event.getX()>bg_on.getWidth()||event.getY()>bg_on.getHeight())
return false;
OnSlip = true;
DownX = event.getX();
NowX = DownX;
break;
case MotionEvent.ACTION_UP://松开
OnSlip = false;
boolean LastChoose = NowChoose;
if(event.getX()>=(bg_on.getWidth()/2))
NowChoose = true;
else
NowChoose = false;
if(isChgLsnOn&&(LastChoose!=NowChoose))//如果设置了监听器,就调用其方法..
ChgLsn.OnChanged(NowChoose);
break;
default:
}
invalidate();//重画控件
return true;
}
public void SetOnChangedListener(OnChangedListener l){//设置监听器,当状态修改的时候
isChgLsnOn = true;
ChgLsn = l;
}
}
onchangeListener.class
package CMD100.demo.slipButton;
public interface OnChangedListener {
abstract void OnChanged(boolean CheckState);
}
main.xml代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
>
<TextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="@string/hello"
/>
<LinearLayout
Android:orientation = "horizontal"
Android:layout_width = "fill_parent"
Android:layout_height = "wrap_content"
Android:background = "#ff0000"
>
<TextView
Android:text = "测试:"
Android:layout_width = "wrap_content"
Android:layout_height = "wrap_content"
/>
<CMD100.demo.slipButton.SlipButton
Android:id = "@+id/slipBtn"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginLeft = "10sp"
/>
</LinearLayout>
</LinearLayout>
注意:在xml里头要放置的位置
<[包名].SlipButton
Android:id = "@+id/slipBtn"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
/>
然后可以像其他控件一样使用了...
SlipButton myBtn =(SlipButton) findViewById(R.id.slipBtn);
myBtn.SetOnChangedListener(...);
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2011-09/43213.htm
转载于:https://www.cnblogs.com/sode/archive/2012/08/04/2622913.html
android 拖动按钮相关推荐
- android特效按钮点击效果
2019独角兽企业重金招聘Python工程师标准>>> android特效按钮点击效果,动画从里到外渐变放大散花效果,本例子适合做一些特效的app使用, 使用很简单,直接可以把里面代 ...
- android 去掉按钮阴影效果,Android去掉button阴影
鼠标右击[我的电脑]选择[属性] 在[属性]窗口中选择[高级]标签 在[高级]标签页面下选择[性能] [设置] 在打开的窗口中把:[在桌面上为图表标签使用阴影]前面选中,确定退出,就OK了. 今天弄一 ...
- Android拖动和缩放图片
Android拖动和缩放图片 2014年5月9日 我们在使用应用其中常常须要浏览图片.比方在微信其中.点击图片之后能够对图片进行缩放. 本博客介绍怎样对图片进行拖拽和缩放.这首先要了解Android中 ...
- android 中间按钮突出,Android 实现 按钮从两边移到中间动画效果
Android 实现 按钮从两边移到中间动画效果html package org.shuxiang.test; import android.app.Activity; import android. ...
- Android 拖动条(SeekBar)实例 附完整demo项目代码
Android 拖动条(SeekBar)实例 附完整demo项目代码 1.拖动条的事件 实现SeekBar.OnSeekBarChangeListener接口.需要监听三个事件: 数值改变(onPro ...
- android按钮防止重复点击事件,实例详解Android解决按钮重复点击问题
为了防止用户或者测试MM疯狂的点击某个button,写个方法防止按钮连续点击.具体实例代码如下所示: public class BaseActivity extends Activity { prot ...
- android自动触发返回,ionic4处理android返回按钮事件
前言 之前在这里介绍了ionic3如何处理android返回按钮 ionic4和ionic3关于android返回按钮的处理是不一样的,而且有点坑,所以本文介绍一下 效果演示 如下gif,所有返回操作 ...
- android浮动按钮_Android浮动操作按钮示例教程
android浮动按钮 Today we will learn about Android Floating Action Button. We'll discuss the FloatingActi ...
- android浮动按钮_Android扩展浮动操作按钮
android浮动按钮 Extended Floating Action Button is the newly introduced class with Material Components l ...
最新文章
- spring的事务隔离_再深一点:面试工作两不误,源码级理解Spring事务
- 纵向表格_Excel如何把横向数据变纵向?教你一键快速实现
- 优秀的中文分词第三方库——jieba
- Chapter 3 Phenomenon——24
- boost::range模块replaced相关的测试程序
- bzoj 3209: 花神的数论题
- 云漫圈 | 如何给女朋友解释什么是HTTP
- 跟我学spring3 电子书下载(完)
- ceph(7)--Ceph 的基本操作和常见故障排除方法
- Taylor’s Formula - 泰勒公式
- 网络安全等级保护2.0详解
- ansible管理界面_Ansible和Google日历集成,用于变更管理
- 抛物型偏微分方程的Crank-Nicolson 方法; Richardson 外推法;紧差分法
- 机器学习入门(浅谈L1和L2正则)
- Mac有滚动截图工具吗?----解救 MAC 使用者们的高效截图工具- Xnip
- Python中的装饰器的简单介绍02
- 涉嫌行贿 三星掌门人等韩企大佬将首次集体接受质询
- 【CSS样式按钮点击的样式,按钮被点击时的样式】
- 嵌入式新手学习路线,嵌入式课程学习课程分享
- MachineLearning 13. 机器学习之降维方法UMAP及可视化 (umap)
热门文章
- 扫地机自动回充揭秘之小米/iRobot/云鲸/360
- rust石头墙几个c4_从安顺自驾石头寨一日游
- 数据挖掘实践(金融风控)——task02:数据分析
- Unet美发实例分割,染发展示
- 聚类算法实现:DBSCAN、层次聚类、K-means、
- oracle数据库插入多表,在Oracle数据库中插入嵌套表
- Oracle Data Guard (RAC+DG) 归档删除策略及脚本
- 从某软件引发的深思总结
- 《Android Property
- mysql登陆时报错PID_Mysql 启动错误:the server quit without updating pid