Android自定义控件(一)——开关控件
Google 在 API 14 开始才新增了Switch 控件。
因此,我们可以选择自己封装一个Switch 。
效果如图:
View主要代码:
- public class SwitchView extends LinearLayout {
- private ImageView maskImage; // 开关遮盖图片
- private boolean open; // 开关当前状态
- private boolean isAninFinish = true; // 动画是否结束
- private float x; // 记录ACTION_DOWN时候的横坐标
- private boolean isChangedByTouch = false; // 是否在一次事件中已经切换过状态
- private OnSwitchChangeListener switchChangeListener; // 监控开关状态
- public interface OnSwitchChangeListener {
- void onSwitchChanged(boolean open);
- }
- public SwitchView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
- public SwitchView(Context context) {
- super(context);
- init();
- }
- private void init() {
- setBackgroundResource(R.drawable.switch_bg);
- maskImage = new ImageView(getContext());
- maskImage.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
- maskImage.setImageResource(R.drawable.switch_mask);
- addView(maskImage);
- }
- public boolean getSwitchStatus() {
- return open;
- }
- public void setSwitchStatus(boolean isOpen) {
- this.open = isOpen;
- if (isOpen) {
- setGravity(Gravity.RIGHT);
- } else {
- setGravity(Gravity.LEFT);
- }
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN: {
- x = event.getX();
- break;
- }
- case MotionEvent.ACTION_MOVE: {
- if (event.getX() - x > 5 && !open) { // 向右
- changeStatus();
- } else if (event.getX() - x < -5 && open) { // 向左
- changeStatus();
- }
- break;
- }
- case MotionEvent.ACTION_UP: {
- if (Math.abs(event.getX() - x) <= 5) {
- changeStatus();
- }
- isChangedByTouch = false;
- break;
- }
- case MotionEvent.ACTION_CANCEL: {
- isChangedByTouch = false;
- break;
- }
- }
- return true;
- }
- private void changeStatus() {
- if (isAninFinish && !isChangedByTouch) {
- isChangedByTouch = true;
- open = !open;
- isAninFinish = false;
- if (switchChangeListener != null) {
- switchChangeListener.onSwitchChanged(open);
- }
- changeOpenStatusWithAnim(open);
- }
- }
- private void changeOpenStatusWithAnim(boolean open) {
- if (open) {
- // 左到右
- Animation leftToRight = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0,
- Animation.ABSOLUTE, getWidth() - maskImage.getWidth(),
- Animation.RELATIVE_TO_SELF, 0,
- Animation.RELATIVE_TO_SELF, 0);
- leftToRight.setDuration(300);
- leftToRight.setAnimationListener(new AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) {
- }
- @Override
- public void onAnimationRepeat(Animation animation) {
- }
- @Override
- public void onAnimationEnd(Animation animation) {
- maskImage.clearAnimation();
- setGravity(Gravity.RIGHT);
- isAninFinish = true;
- }
- });
- maskImage.startAnimation(leftToRight);
- } else {
- // 右到左
- Animation rightToLeft = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0,
- Animation.ABSOLUTE, maskImage.getWidth() - getWidth(),
- Animation.RELATIVE_TO_SELF, 0,
- Animation.RELATIVE_TO_SELF, 0);
- rightToLeft.setDuration(300);
- rightToLeft.setAnimationListener(new AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) {
- }
- @Override
- public void onAnimationRepeat(Animation animation) {
- }
- @Override
- public void onAnimationEnd(Animation animation) {
- maskImage.clearAnimation();
- setGravity(Gravity.LEFT);
- isAninFinish = true;
- }
- });
- maskImage.startAnimation(rightToLeft);
- }
- }
- public OnSwitchChangeListener getSwitchChangeListener() {
- return switchChangeListener;
- }
- public void setOnSwitchChangeListener(OnSwitchChangeListener switchChangeListener) {
- this.switchChangeListener = switchChangeListener;
- }
- }
测试用代码:
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- SwitchView switchView = (SwitchView) findViewById(R.id.switchview);
- switchView.setSwitchStatus(true);
- switchView.setOnSwitchChangeListener(new OnSwitchChangeListener() {
- @Override
- public void onSwitchChanged(boolean open) {
- Toast.makeText(MainActivity.this, "开关状态:" + open, Toast.LENGTH_SHORT).show();
- }
- });
- }
- }
测试用布局:
- <LinearLayout 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"
- android:padding="20dp"
- >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="自定义开关状态:"
- />
- <com.fancyy.switchview.SwitchView
- android:layout_marginLeft="20dp"
- android:id="@+id/switchview"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </LinearLayout>
测试代码下载:http://download.csdn.net/detail/a105865708/6800519
Android自定义控件(一)——开关控件的更多相关文章
- Android自定义控件之日历控件
标签: android 控件 日历 应用 需求 2015年09月26日 22:21:54 25062人阅读 评论(109) 收藏 举报 分类: Android自定义控件系列(7) 版权声明:转载注 ...
- android自己定义开关控件
近日在android项目要使用开关控件.可是android中自带的开关控件不太惬意,所以就打算通过自己定义View写一个开关控件 ios的开关控件当然就是我要仿照的目标. 先上图: waterma ...
- Android自定义控件1--自定义控件介绍
Android控件基本介绍 Android本身提供了很多控件比如我们常用的有文本控件TextView和EditText:按钮控件Button和ImageButton状态开关按钮ToggleButton ...
- Android - 自定义控件之圆形控件
自定义控件 - 圈圈 Android L: Android Studio 效果:能够自定义圆圈半径和位置:设定点击效果:改变背景颜色 下面是demo图 点击前: 点击后: 自定义控件一般要继承View ...
- android 仿ios开关控件
ios一些控件还是挺美丽的,可是对android程序猿来说可能比較苦逼,由于ios一些看起来简单的效果对android来说可能就没那么简单了,可是没办法非常多产品都是拿ios的一些控件叫android ...
- Android开发技巧——自定义控件之组合控件
Android开发技巧--自定义控件之组合控件 我准备在接下来一段时间,写一系列有关Android自定义控件的博客,包括如何进行各种自定义,并分享一下我所知道的其中的技巧,注意点等. 还是那句老话,尽 ...
- Android常用酷炫控件(开源项目)github地址汇总
转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...
- Android 常用炫酷控件(开源项目)git地址汇总
第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.P ...
- MaterialEditText——Android Material Design EditText控件
MaterialEditText是Android Material Design EditText控件.可以定制浮动标签.主要颜色.默认的错误颜色等. 随着 Material Design 的到来, ...
- (转载)Android自定义标签列表控件LabelsView解析
Android自定义标签列表控件LabelsView解析 作者 donkingliang 关注 2017.03.15 20:59* 字数 759 阅读 406评论 0喜欢 3 无论是在移动端的App, ...
随机推荐
- Android(java)学习笔记262:JNI之工具快速开发步骤
下面通过一个案例说明一下,利用工具jni快速开发步骤 1.新建一个Android工程,命名为"03_对int数组加1",如下: 2. 在MainActivity.java中对add ...
- Selenium2学习之-环境搭建
1.下载安装Eclipse 2.下载并配置jdk环境变量 2.1 介绍一下环境变量设置 2.1.1 点击环境变量 2.1.2 新增系统变量JAVA_HOME 变量名:JAVA_HOME 变量值:C:\ ...
- (转)巧用clear:both
我们在制作网页中用div+css或者称xhtml+css都会遇到一些很诡异的情况,明明布局正确,但是整个画面却混乱起来了,有时候在IE6下看的很正常的,到ie7或者火狐下看时,就一片混乱了,无论怎么计 ...
- SQL从入门到基础 - 05 数据分组、Having语句
一.数据分组 1. 按照年龄进行分组统计各个年龄段的人数: Select FAge,count(*) from T_Employee group by FAge; 2. Group by子句必须放到w ...
- 查看Linux相关信息
1."uname -a ",可显示电脑以及操作系统的相关信息. 2."cat /proc/version",说明正在运行的内核版本. 3."cat / ...
- ios内存详解
IOS以及Mac os都是基于Unix/linux改造出来的,而在内存管理方面也沿用了Unix/Linux的内存管理机制. 下面主要说的是IOS系统,有很多比较喜欢捣鼓的吧友肯定自己清理过机器的内存, ...
- sealed 密封类,不能被其他类继承,但可以继承其他类
public sealed class Person:继承类名 { }
- 矩阵链乘 hrbust 1600
#include<string.h> //区间dp的思想#include<iostream> //将一个区间分成两段,将每一段当成是一个矩阵#include<stdio. ...
- C/C++中字符串存储位置
代码: #include <iostream> #include <cstdio> using namespace std; void fun(char **p){ //cha ...
- 使用Jquery解决Asp.Net中下拉列表值改变后访问服务器刷新界面。
使用DropDownList控件时,改变选项时,获取服务端数据库数据并刷新界面数据. 1. 绑定DropDownList控件SelectedIndexChanged事件. 2. AutoPortBac ...