我们都知道Android4.0以上才带有滑动开关Switch,那么在4.0以下呢,很多人会选择用CheckBox,放两张图片,但是这样子只能点击,效果不太好,所以我就自定义了滑动开关WiperSwitch这么一个控件,下面先把截图贴上吧,这蹩脚的图片真戳啊,大家可以自己换三张图片
package com.example.wiperswitch; 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.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; /** * * @author xiaanming * */ public class WiperSwitch extends View implements OnTouchListener{ private Bitmap bg_on, bg_off, slipper_btn; /** * 按下时的x和当前的x */ private float downX, nowX; /** * 记录用户是否在滑动 */ private boolean onSlip = false; /** * 当前的状态 */ private boolean nowStatus = false; /** * 监听接口 */ private OnChangedListener listener; public WiperSwitch(Context context) { super(context); init(); } public WiperSwitch(Context context, AttributeSet attrs) { super(context, attrs); init(); } public void init(){ //载入图片资源 bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.on_btn); bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.off_btn); slipper_btn = BitmapFactory.decodeResource(getResources(), R.drawable.white_btn); setOnTouchListener(this); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); Matrix matrix = new Matrix(); Paint paint = new Paint(); float x = 0; //根据nowX设置背景,开或者关状态 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() - slipper_btn.getWidth()/2;//减去滑块1/2的长度 else x = nowX - slipper_btn.getWidth()/2; }else { if(nowStatus){//根据当前的状态设置滑块的x值 x = bg_on.getWidth() - slipper_btn.getWidth(); }else{ x = 0; } } //对滑块滑动进行异常处理,不能让滑块出界 if (x < 0 ){ x = 0; } else if(x > bg_on.getWidth() - slipper_btn.getWidth()){ x = bg_on.getWidth() - slipper_btn.getWidth(); } //画出滑块 canvas.drawBitmap(slipper_btn, x , 0, paint); } @Override public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN:{ if (event.getX() > bg_off.getWidth() || event.getY() > bg_off.getHeight()){ return false; }else{ onSlip = true; downX = event.getX(); nowX = downX; } break; } case MotionEvent.ACTION_MOVE:{ nowX = event.getX(); break; } case MotionEvent.ACTION_UP:{ onSlip = false; if(event.getX() >= (bg_on.getWidth()/2)){ nowStatus = true; nowX = bg_on.getWidth() - slipper_btn.getWidth(); }else{ nowStatus = false; nowX = 0; } if(listener != null){ listener.OnChanged(WiperSwitch.this, nowStatus); } break; } } //刷新界面 invalidate(); return true; } /** * 为WiperSwitch设置一个监听,供外部调用的方法 * @param listener */ public void setOnChangedListener(OnChangedListener listener){ this.listener = listener; } /** * 设置滑动开关的初始状态,供外部调用 * @param checked */ public void setChecked(boolean checked){ if(checked){ nowX = bg_off.getWidth(); }else{ nowX = 0; } nowStatus = checked; } /** * 回调接口 * @author len * */ public interface OnChangedListener { public void OnChanged(WiperSwitch wiperSwitch, boolean checkState); } }
用法是,先定义XML文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.wiperswitch.WiperSwitch android:id="@+id/wiperSwitch1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
新建一个Activity
package com.example.wiperswitch; import android.app.Activity; import android.os.Bundle; import android.util.Log; import com.example.wiperswitch.WiperSwitch.OnChangedListener; public class MainActivity extends Activity implements OnChangedListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化WiperSwitch WiperSwitch wiperSwitch = (WiperSwitch)findViewById(R.id.wiperSwitch1); //设置初始状态为false wiperSwitch.setChecked(false); //设置监听 wiperSwitch.setOnChangedListener(this); } @Override public void OnChanged(WiperSwitch wiperSwitch, boolean checkState) { Log.e("log", "" + checkState); } }
代码全部上完了,写的不好的地方欢迎大牛指点!
哦,忘记了还有三张蹩脚的图片没传
相关推荐
总结一下,创建一个自定义滑动开关控件需要理解Android的绘图机制、事件处理以及自定义视图的生命周期。通过合理的布局设计和动画处理,可以实现美观且功能完备的滑动开关。在实际项目中,这样的自定义控件能够更好...
"android之自定义开关控件"这个主题旨在教你如何在Android平台上创建一个类似苹果iOS Toggle的自定义开关组件。以下是对这个主题的详细讲解: 一、基础知识 在Android中,开关系列的控件主要包括Switch和...
这篇博客文章的配套源码提供了一个自定义滑动开关的实现,让我们深入探讨这个自定义控件的设计和实现。 首先,滑动开关的基本原理是利用Android的View类或者CompoundButton类进行扩展。在这个例子中,开发者可能...
总结来说,创建自定义滑动开关的关键步骤包括: 1. 创建自定义View类,继承自CompoundButton。 2. 重写`onDraw()`方法,根据开关状态绘制不同背景。 3. 重写`onTouchEvent()`方法,处理触摸事件,更新开关状态。 4....
本文将深入探讨如何使用Android自定义View来实现一个仿iOS风格的开关控件。首先,我们需要了解自定义View的基本流程和关键组件。 一、自定义View基础 自定义View通常涉及到以下步骤: 1. 创建一个新的类,继承自`...
创建自定义滑动开关的第一步是定义布局XML。在这个过程中,我们需要创建一个新的`View`类,继承自Android的`View`或`CompoundButton`。这里我们可以继承`CompoundButton`,因为它已经内置了切换状态的处理逻辑。接着...
本示例提供的"qt5仿安卓苹果自定义滑动开关控件.rar"就是一个这样的实践,它实现了类似Android和iOS系统中的滑动开关(Slider或Switch)组件,能够清晰地显示开关的状态,并且通过使用定时器来控制滑动动画,增加了...
通过学习和实践自定义滑动开关的开发,你不仅可以提升自己的Android编程技能,还能更好地理解和控制应用的视觉表现和交互行为。记得在实际项目中进行测试,确保自定义开关在各种设备和屏幕尺寸上都能正常工作。
这个自定义控件可以无缝集成到任何Android项目中,提供与系统开关相似的功能,同时具备更高的可定制性和更好的用户体验。在实际开发中,还可以考虑增加动画效果、无障碍支持等特性,以进一步提升控件的质量和可用性...
首先,我们需要了解Android自定义控件的基本流程。自定义控件通常涉及以下步骤: 1. 创建一个新的Java类,继承自Android的View或ViewGroup类。在这个例子中,我们可以选择继承自CompoundButton,因为Toggle Switch...
原生的Switch是Android系统提供的一个开关控件,它允许用户在两个状态之间切换,通常用于开启或关闭某个功能。它的样式和行为可以通过XML属性进行定制,如颜色、文字、大小等。然而,要实现iOS的开关样式,这些原生...
以上就是实现Android自定义滑动开关的两种主要方式,以及如何通过自定义属性进行样式定制。理解并掌握这些知识点,开发者可以在应用中创造出独特且富有交互性的用户界面。同时,自定义View也是提升个人技能和项目...
以上就是创建一个自定义滑动开关控件的基本流程。在实际项目中,你可能会根据需求增加更多的功能,如动画效果、触摸反馈等。理解并掌握这个过程,将使你在Android开发中更加游刃有余,能够创建出更符合设计需求的...
本文将深入探讨如何基于Android系统自带的Switch控件,创建一个名为SwitchView的自定义开关控件,并适用于较低的SDK版本。 首先,我们需要理解Android系统自带的Switch控件。Switch是Android 4.0(API级别14)引入...
"android 自定义开关按钮"这个主题就是关于如何在Android应用中创建一个独特且吸引人的开关控件,通常这种开关按钮用于切换功能的开启或关闭,如静音、Wi-Fi等设置。下面我们将深入探讨这一话题。 首先,Android...
"android自定义滑动按钮"是一个专题,旨在教你如何在Android平台上创建一个具有滑动手势的开关按钮,这种控件通常用于开启或关闭某个功能,如Wi-Fi、蓝牙等。下面将详细解释这个知识点。 一、自定义滑动按钮的基本...
总的来说,自定义滑动开关和切换按钮涉及到Android的图形绘制、动画处理、事件监听等多个方面,需要对Android SDK有深入的理解。通过自定义,我们可以创造出更符合应用需求的交互体验,提升用户的使用感受。实践中,...
这个压缩包"Android自定义控件源码.rar"包含了一些自定义控件的源代码,虽然不能保证每个都可直接运行,但它们提供了丰富的学习资源,帮助开发者理解和实践自定义控件的创建过程。下面将详细探讨Android自定义控件的...