自定义一个可以随着手指拖动的按钮
来源:互联网 发布:qq显示当前网络不可用 编辑:程序博客网 时间:2024/05/01 08:47
效果图:
关状态 中间拖动 开开关
素材图片
关状态的背景图
开状态的背景图
拖动的按钮
下面就直接来看看代码吧:
一、自定义的一个控件:
一、自定义的一个控件:package com.zhong.newswitch.view;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import com.zhong.newswitch.R;public class SlideSwitch extends View { private Bitmap imgOn; private Bitmap imgOff; private Bitmap imgBtn; private float countX; private int viewWidth; private int viewHeight; private OnSwitchStateChangListener listener; private boolean switchState; private boolean lastStaete; //设置一个事件监听的方法 public void setOnSwitchStateChangListener(OnSwitchStateChangListener listener) { this.listener = listener; } public SlideSwitch(Context context) { super(context); init(context, null, 0); } public SlideSwitch(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0); } public SlideSwitch(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs, defStyle); } private void init(Context context, AttributeSet attrs, int defStyle) { //获取“开”的背景图片的BitMap对象 imgOn = BitmapFactory.decodeResource(getResources(), R.drawable.slide_bg_on); //获取“关”的背景图片的BitMap对象 imgOff = BitmapFactory.decodeResource(getResources(), R.drawable.slide_bg_off); //获取“按钮”的背景图片的BitMap对象 imgBtn = BitmapFactory.decodeResource(getResources(), R.drawable.slide_btn); if (attrs!=null){ //获取到自定义的xml中的已经声明的属性 此处要使用自定义的xml中的name TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.slide); //获取自定义的第一项的属性,获取属性值当找不到时返回默认值, boolean state = arr.getBoolean(0, false); //释放资源 arr.recycle(); //直接调用设置初始的状态 setSwitchState(state); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //获取背景图片的高作为控件的高 viewWidth = imgOff.getWidth(); viewHeight = imgOff.getHeight(); //设置控件的宽高 setMeasuredDimension(viewWidth, viewHeight); } @Override protected void onDraw(Canvas canvas) { if (countX < imgBtn.getWidth() / 2) { //判断不能移出外面 countX = imgBtn.getWidth() / 2; } if (countX > (imgOff.getWidth() - imgBtn.getWidth() / 2)) { countX = imgOff.getWidth() - imgBtn.getWidth() / 2; } //当移动过了中间线左边时图片为关,在右边背景改为开的图片 if (countX < imgOff.getWidth() / 2) { canvas.drawBitmap(imgOff, 0, 0, null); } else { canvas.drawBitmap(imgOn, 0, 0, null); } //绘制小按钮 canvas.drawBitmap(imgBtn, countX - imgBtn.getWidth() / 2 - 2, 0, null); } @Override public boolean onTouchEvent(MotionEvent event) { countX = event.getX(); switch (event.getActionMasked()) { case MotionEvent.ACTION_UP: //当手离开地没有在边上,判断后直接跳到边去 if (countX < viewWidth / 2) { countX = imgBtn.getWidth() / 2; switchState = false; } else { countX = imgOff.getWidth() - imgBtn.getWidth() / 2; switchState = true; } //判断是否有监听如果没有设置监听不调用,判断现在的状态原先的状态是否一样,如果一样不调用 if (listener != null&&lastStaete!=switchState) { listener.OnSwitchStateChang(switchState); } lastStaete = switchState; break; case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: break; } invalidate(); return true; } //添加一个可以设置选中状态的方法 public void setSwitchState(boolean state) { lastStaete=state; if (state){ countX = imgOff.getWidth() - imgBtn.getWidth() / 2; }else{ countX = imgBtn.getWidth() / 2; } } //添加一个开关事件的监听接口 public interface OnSwitchStateChangListener { void OnSwitchStateChang(boolean state); }}二、自定义一个第一在xml中用的属性
在res目录下键 res-values-slft_attrs.xml
<span style="color:#000000;"><?xml version="1.0" encoding="utf-8"?><!--自定义控件的属性--><resources> <!--声明属性name必须有--> <declare-styleable name="slide"> <!--name="state"属性名,format="boolean"属性类型--> <attr name="state" format="boolean"></attr> </declare-styleable></resources></span>
三、main.xml中的代码
<span style="color:#000000;"><?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:my="http://schemas.android.com/apk/res/com.zhong.newswitch" android:orientation="vertical" android:background="#FFF" android:gravity="center" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!--com.zhong.newswitch为应用的包名--> <com.zhong.newswitch.view.SlideSwitch my:state="true" android:id="@+id/switch_main" android:layout_width="wrap_content" android:layout_height="wrap_content" /></RelativeLayout></span>
四 、MainActivity中的代码
<span style="color:#000000;">package com.zhong.newswitch;import android.app.Activity;import android.os.Bundle;import android.widget.Toast;import com.zhong.newswitch.view.SlideSwitch;public class MainActivity extends Activity { /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SlideSwitch slideSwitch= (SlideSwitch) findViewById(R.id.switch_main); //设置初始的状态 slideSwitch.setSwitchState(true); //监听状态 slideSwitch.setOnSwitchStateChangListener(new SlideSwitch.OnSwitchStateChangListener() { @Override public void OnSwitchStateChang(boolean state) { Toast.makeText(MainActivity.this, state+"",Toast.LENGTH_SHORT).show(); } }); }}</span>
ok了
0 0
- 自定义一个可以随着手指拖动的按钮
- 一个可以拖动的自定义Gridview代码
- 创建可以拖动的按钮
- 自定义画一个可以拖动的圆形或图片
- 一个可以跟随手指移动的PopupWindow
- android 实现可以拖动的按钮
- 关于界面随着手指滑动的实现
- android 自定义组件随着手指自动画圆
- android自定义view之画圆随着手指移动
- 安卓中自定义View圆形和拖动圆、跟随手指拖动
- 自定义view画一个圆点击可以拖动
- 自定义View,绘制一个圆形,并可以单击拖动
- 自定义View,创建一个小圆点,单击可以拖动
- 自定义的View,实现一个跟随手指的小球
- View 随着手指的移动而放大和旋转
- 自定义按住按钮拖动窗体
- DiscreteSeekBar是一个Material Design风格的、带有气泡指示器的拖动条。可以自定义样式,非常不错的东西
- Android自定义可以随意拖动的ImageView和TextView
- android ble蓝牙开发略解-Android 蓝牙4.0开发
- web中使用到的一些关于坐标相关知识
- C#中关于Gridview的一些属性(二、绑定数据)
- android中ListView或GridView出现在adapter中的getView出现多次position为0的情况
- 哥们别逗 了,写个脚本那真不叫运维自动化! 【转载】
- 自定义一个可以随着手指拖动的按钮
- JAVA权限修饰符(public/protected/private)
- Android内存优化:ArrayMap
- 字典树
- Python2 简单下载模板
- Apple Watch 开发者套件 WatchKit 发布后,你需要知道这些
- I/O exception (java.net.SocketException) caught when processing request: Connect
- HTML的相关路径与绝对路径的问题
- 002-创建的Eclipse项目中红叹号问题解决思路