自定义控件,开关左右滑动

自定义控件一般的思路都是根据图片,自己绘制相应的控件

布局文件

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context=".MainActivity" >
10
11     <com.itheima27.slidebutton.view.SlideButton
12         android:id="@+id/slidebutton"
13         android:layout_width="wrap_content"
14         android:layout_height="wrap_content"
15         android:layout_centerInParent="true" />
16
17 </RelativeLayout>
  1 import com.itheima27.slidebutton.R;
  2 import com.itheima27.slidebutton.interf.OnToggleStateChangedListener;
  3
  4 import android.content.Context;
  5 import android.graphics.Bitmap;
  6 import android.graphics.BitmapFactory;
  7 import android.graphics.Canvas;
  8 import android.util.AttributeSet;
  9 import android.view.MotionEvent;
 10 import android.view.View;
 11
 12 public class SlideButton extends View {
 13
 14     private Bitmap switchBG;    // 滑动开关的背景
 15     private Bitmap slideButtonBG; // 滑动块的背景
 16     private boolean currentState = false;    // 开关当前的状态, 默认为: 关闭
 17     private int currentX;    // x轴的偏移量
 18     private boolean isSliding = false;        // 是否正在滑动中
 19     private OnToggleStateChangedListener mListener;
 20
 21     public SlideButton(Context context, AttributeSet attrs) {
 22         super(context, attrs);
 23
 24         initBitmap();
 25     }
 26
 27     /**
 28      * 当测量当前控件的宽高时回调
 29      */
 30     @Override
 31     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 32         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 33
 34         // 设置开关的宽和高
 35         setMeasuredDimension(switchBG.getWidth(), switchBG.getHeight());
 36     }
 37
 38     /**
 39      * 绘制当前控件的方法
 40      */
 41     @Override
 42     protected void onDraw(Canvas canvas) {
 43
 44         // 1. 把滑动开关的背景画到画布上
 45         canvas.drawBitmap(switchBG, 0, 0, null);        // 把背景平铺到控件上
 46
 47         // 2. 绘制滑动块显示的位置, 开或者关
 48
 49         if(isSliding) {
 50             int left = currentX - (slideButtonBG.getWidth() / 2);
 51             if(left < 0) {
 52                 left = 0;
 53             } else if(left > switchBG.getWidth() - slideButtonBG.getWidth()) {
 54                 left = switchBG.getWidth() - slideButtonBG.getWidth();
 55             }
 56
 57             canvas.drawBitmap(slideButtonBG, left, 0, null);
 58         } else {
 59             if(currentState) {    // 绘制开关为开的状态
 60                 canvas.drawBitmap(slideButtonBG, switchBG.getWidth() - slideButtonBG.getWidth(), 0, null);
 61             } else {    // 绘制开关为关的状态
 62                 canvas.drawBitmap(slideButtonBG, 0, 0, null);
 63             }
 64         }
 65         super.onDraw(canvas);
 66     }
 67
 68     /**
 69      * 当产生触摸时间时回调此方法
 70      */
 71     @Override
 72     public boolean onTouchEvent(MotionEvent event) {
 73         switch (event.getAction()) {
 74         case MotionEvent.ACTION_DOWN: // 按下
 75             currentX = (int) event.getX();
 76             isSliding  = true;
 77             break;
 78         case MotionEvent.ACTION_MOVE: // 移动
 79             currentX = (int) event.getX();
 80             break;
 81         case MotionEvent.ACTION_UP: // 抬起
 82             isSliding = false;
 83
 84             // 判断当前滑动块, 偏向于哪一边, 如果滑动块的中心点小于背景的中心点, 设置为关闭状态
 85
 86             int bgCenter = switchBG.getWidth() / 2;
 87
 88             boolean state = currentX > bgCenter;        // 改变后的状态
 89
 90             // 调用用户的监听事件
 91             if(state != currentState && mListener != null) {
 92                 mListener.onToggleStateChanged(state);
 93             }
 94
 95             currentState = state;
 96             break;
 97         default:
 98             break;
 99         }
100
101         invalidate();        // 刷新当前控件, 会引起onDraw方法的调用
102         return true;
103     }
104
105     /**
106      * 初始化图片
107      */
108     private void initBitmap() {
109         slideButtonBG = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button_background);
110         switchBG = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
111     }
112
113     /**
114      * 设置开关的状态
115      * @param b
116      */
117     public void setToggleState(boolean b) {
118         currentState = b;
119     }
120
121     /**
122      * 设置开关状态改变的监听事件
123      * @param listener
124      */
125     public void setOnToggleStateChangedListener(OnToggleStateChangedListener listener) {
126         this.mListener = listener;
127     }
128 }
时间: 2024-08-23 21:41:33

自定义控件,开关左右滑动的相关文章

【Android】自定义控件实现可滑动的开关(switch)

~转载请注明来源:http://blog.csdn.net/u013015161/article/details/46704745 介绍 昨天晚上写了一个Android的滑动开关, 即SlideSwitch.效果如下: 实现 实现的思路其实很简单,监听控件上的touch事件,并不断刷新,让滑块在手指的位置上绘出,达到滑块跟着手指滑动的显示效果. 先看一下代码: SlideSwitch.java package com.example.slideswitchexample; import andr

android 自定义控件之 tab滑动效果

下午没有白费,终于仿照别人的代码做出来了. 大体思路是这样的 下面上代码 http://yunpan.cn/Qa5i6s9ApvrSt 提取码 79be

滑动开关效果 css3滑动开关】纯CSS3代码实现滑动开关效果-css3滑动效果-css3左右滑动

今天看到一篇有关 css3事件的博文,一时兴起便整理下相关的资料. 点击按钮,可以实现开关的滑动效果. 今天看到一篇有关 css3事件的博文,一时兴起便整理下相关的资料. 点击按钮,可以实现开关的滑动效果. 今天看到一篇有关 css3事件的博文,一时兴起便整理下相关的资料. 点击按钮,可以实现开关的滑动效果. .toggle input:checked + .ss div { transform: translate3d(60px, 0, 0); background-color: #fff;}

Android自定义控件——自定义属性

转载请注明出处:http://blog.csdn.net/allen315410/article/details/39343401 我们在自定义android组件的时候,除了用Java构建出组件的样子外,有时候还需要去申明一些"属性"提供给项目使用,那么什么是组件的属性呢? 例如在清单文件中,创建一个TextView的时候,这是需要制定TextView的android:layout_width="wrap_content" android:layout_height

c#Winform自定义控件-目录

前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果觉得写的还行,请点个 star 支持一下吧 欢迎前来交流探讨: 企鹅群568015492  ~~~持续增加中~~~~~ 自定义控件 (一)c#Winform自定义控件-基类控件 (二

Android进阶之绘制-自定义View完全掌握(四)

前面的案例中我们都是使用系统的一些控件通过组合的方式来生成我们自定义的控件,自定义控件的实现还可以通过自定义类继承View来完成.从该篇博客开始,我们通过自定义类继承View来实现一些我们自定义的控件. 我们通过一个案例来学习,现在来实现这样一个效果. 我们新建一个类MyToggleButton,让它继承View. 注意,一定要重写带两个参数的构造方法,因为如果我们在布局文件使用该类,将会用这个构造方法实例该类,如果没有就崩溃. 介绍一下一个控件从创建到显示过程中的主要方法. 执行构造方法实例化

iOS用户交互-设计原则

一. 完整性原则 审美的完整性并不是衡量一个好的app的漂亮的外观,完整性不仅体现在漂亮的外观而是漂亮的外观和聚成的功能的一致性,人们通常关系的事app的功能是否是像它介绍的一样.但是它们同时也收到外观和app的表示行为的影响,如果只有好的服务内容没有好的外观不能说是美的app,如果只有漂亮的外观没有好的内容,也不是完美的app,只有二者结合才能算是成功的app.如果app的逻辑不清晰,当用户的操作没有回应,错误的信息显示出来,这样人们会潜意识对这个app产生不相信的感觉,就觉得这个app不靠谱

Linux ALSA声卡驱动之四:Control设备的创建

声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢! Control接口 Control接口主要让用户空间的应用程序(alsa-lib)可以访问和控制音频codec芯片中的多路开关,滑动控件等.对于Mixer(混音)来说,Control接口显得尤为重要,从ALSA 0.9.x版本开始,所有的mixer工作都是通过control接口的API来实现的. ALSA已经为AC97定义了完整的控制接口模型,如果你的Codec芯片只支持AC97接口,你

带你玩转web开发之四 -如何用JS做登录注册页面校验

今日内容 使用JQuery完成页面定时弹出广告 使用JQuery完成表格的隔行换色 使用JQuery完成复选框的全选效果 使用JQuery完成省市联动效果 使用JQuery完成下列列表左右选择 使用JQuery完成表单的校验. 今日目标: 掌握JQuery的基本使用 掌握JQuery的基本选择器,层次选择器 会使用JQuery完成DOM的基本操作 定时弹出广告 定时器: setInterval setTimeout clearInterval style.display : none 隐藏 bl