iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android自定义控件实现滑动开关效果
  • 284
分享到

Android自定义控件实现滑动开关效果

开关Android 2022-06-06 08:06:54 284人浏览 薄情痞子
摘要

自定义开关控件   Android自定义控件一般有三种方式 1、继承Android固有的控件,在Android原生控件的基础上,进行添加功能和逻辑。 2、继承V

自定义开关控件

 

Android自定义控件一般有三种方式
1、继承Android固有的控件,在Android原生控件的基础上,进行添加功能和逻辑。
2、继承ViewGroup,这类自定义控件是可以往自己的布局里面添加其他的子控件的。
3、继承View,这类自定义控件没有跟原生的控件有太多的相似的地方,也不需要在自己的肚子里添加其他的子控件。

ToggleView自定义开关控件表征上没有跟Android原生的控件有什么相似的地方,而且在滑动的效果上也没有沿袭Android原生的地方,所以我们的自定义ToggleView选择继承View

 同样的自定义控件需要复写三个构造方法


//在布局中使用该控件的时候,而且有额外的style属性的时候调用该构造方法,
public ToggleView(Context context, AttributeSet attrs, int defStyle);
//在布局中使用该控件的时候调用该构造方法
public ToggleView(Context context, AttributeSet attrs)
//在Java代码中直接new该控件的时候,调用该构造方法
public ToggleView(Context context)

因为是自定义的控件,所以属性还是自己定义的比较好用一些。我们这里定义三个属性
1、背景图片
2、滑块的图片
3、布局中默认的开关的状态

所以就需要用到了自定义属性
在values目录下,新建xml文件,attrs.xml
在里面定义自己的属性


<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="toggle">
   <attr name="switchBackground" fORMat="reference" />
   <attr name="slidingBackground" format="reference" />
   <attr name="toggleState" format="boolean" />
  </declare-styleable>
</resources>

<declare-styleable name属性>是可以在R文件中找到该属性名称的

<attr>标签中,一个标签写一个属性 name属性表示属性名称,format表示属性类型

这里定义了三个属性名和属性类型。

属性和自定义控件的三个构造方法已经完成,就我们就可以在布局文件中添加自定义的控件了


<RelativeLayout 
 xmlns:android="Http://schemas.android.com/apk/res/android"
 xmlns:hss="http://schemas.android.com/apk/res/com.hss.toggle"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
  >
 <com.hss.toggle.ToggleView
  android:id="@+id/toggleView"
  android:layout_height="wrap_content"
  android:layout_width="wrap_content"
  android:layout_centerInParent="true"
  hss:switchBackground="@drawable/switch_background"
  hss:slidingBackground="@drawable/slide_button_background"
  hss:toggleState="true"
  >
  </com.hss.toggle.ToggleView>
</RelativeLayout>

注意:在我自定义控件com.hss.toggle.ToggleView中,部分属性是以android开头的,部分属性是以hss(我自己定义的命名空间)开头的,这是为什么呢?

注意看本片代码第二行,

xmlns:hss="http://schemas.android.com/apk/res/com.hss.toggle"

我在这里写着样一行代码,就说明把values/attrs.xml中的每个条目都导入进来了,就可以直接使用我在attrs.xml里面的属性了

可以直接使用自定义的属性之后,问题应该聚焦到怎么在Java代码中获取到我自定义的属性的值呢?

根据命名空间和自定义属性的name值获取,看代码:


String namespace = "http://schemas.android.com/apk/res/com.hss.toggle";
  int toggle_switchbackground = attrs.getAttributeResourceValue(namespace, "switchBackground", -1);
  int toggle_slidingbackground = attrs.getAttributeResourceValue(namespace, "slidingBackground", -1);
  toggle_state = attrs.getAttributeBooleanValue(namespace, "toggleState", false);

看到没?该方法用到了attr参数,所以获取自定义属性值的操作应该在两个参数的那里面执行。

整体的自定义控件的类见代码:


package com.hss.toggle;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class ToggleView extends View {
 private static final String TAG = "ToogleView";
 private Bitmap sliding_background;
 private Bitmap switch_background;
 private boolean isSliding = false;
 private boolean toggle_state = false;
 private int downX;
 private mToggleStateChangeListener;
 // 构造方法,在xml文件布局的时候,指定了style的时候调用
 public ToggleView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
 }
 // 构造方法,在xml文件中布局的时候,没有指定style的时候调用
 public ToggleView(Context context, AttributeSet attrs) {
  this(context, attrs, 0);
  //在Java代码中 获取到xml中自定义属性对应的值
  String namespace = "http://schemas.android.com/apk/res/com.hss.toggle";
  int toggle_switchbackground = attrs.getAttributeResourceValue(namespace, "switchBackground", -1);
  int toggle_slidingbackground = attrs.getAttributeResourceValue(namespace, "slidingBackground", -1);
  toggle_state = attrs.getAttributeBooleanValue(namespace, "toggleState", false);
  Log.i(TAG,""+toggle_slidingbackground+"  "+toggle_switchbackground);
  // 设置自定义开关的图片
  setToggleSwitchBackground(toggle_switchbackground);
  setToggleSlidingBackground(toggle_slidingbackground);
  setToggleState(toggle_state);
 }
 // 构造方法 在代码中new的时候调用
 public ToggleView(Context context) {
  this(context, null);
 }
 
 private void setToggleSlidingBackground(int toggle_slidingbackground) {
  sliding_background = BitmapFactory.decodeResource(getResources(),toggle_slidingbackground);
 }
 
 private void setToggleSwitchBackground(int toggle_switchbackground) {
  switch_background = BitmapFactory.decodeResource(getResources(),toggle_switchbackground);
 }
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  //测量控件的大小,设置控件的大小为背景图片的大小
  setMeasuredDimension(switch_background.getWidth(),switch_background.getHeight());
 }
 @Override
 protected void onDraw(Canvas canvas) {
  //开始画自定义控件,使用canvas对象先把背景图片画上来
  canvas.drawBitmap(switch_background, 0, 0, null);
  if (isSliding) {
  //如果是滑动状态
   //控件距离左边的相对距离为:(控件每时每刻的距离自己左上方的焦点的x轴距离)-(控件本身一半的x轴宽度)
   int left = downX - sliding_background.getWidth() / 2;
   //控件最大的滑动距离(距离左边最大的距离)就是:(背景图片的宽度)-(滑块图片的宽度)
   int rightAlign = switch_background.getWidth()- sliding_background.getWidth();
   //如果距离左边的距离小于0,,就不让他继续往左边动了
   if (left < 0) {
    left = 0;
   } else if (left > rightAlign) {
    //如果距离左边的距离》应该距离左边的最大距离,也不让他往右边移动了
    left = rightAlign;
   }
   //控制好属性之后就可以时时刻刻的跟着画了
   canvas.drawBitmap(sliding_background, left, 0, null);
  } else {
   //如果不滑动,则根据控件的属性中开关的状态,来画滑块的位置
   if (toggle_state) {
    //如果开关状态为真,滑块移动到最右边
    int left = switch_background.getWidth() - sliding_background.getWidth();
    canvas.drawBitmap(sliding_background, left, 0, null);
   } else {
    //如果开关状态为假,滑块移动到最左边
    canvas.drawBitmap(sliding_background, 0, 0, null);
   }
  }
  super.onDraw(canvas);
 }
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  //重写触摸事件
  int action = event.getAction();
  switch (action) {
  case MotionEvent.ACTION_DOWN:
   //开始点击的时候,是否滑动置为真,获取到当前手指的距离
   isSliding = true;
   downX = (int) event.getX();
   break;
  case MotionEvent.ACTION_MOVE:
   downX = (int) event.getX();
   break;
  case MotionEvent.ACTION_UP:
   //当点击结束的时候将是否滑动记为假,获取到移动的x轴的坐标
   downX = (int) event.getX();
   isSliding = false;
   //获取到背景图片中间的那个值
   int center = switch_background.getWidth() / 2;
   boolean state = downX > center;
   //如果先后的状态不相同,则将新的状态赋给成员变量,然后调用监听的方法
   if (toggle_state != state) {
    toggle_state = state;
    if (null != mToggleStateChangeListener) {
     mToggleStateChangeListener
       .onToggleState(toggle_state);
    }
   }
   break;
  }
  //调用一次onDraw()方法
  invalidate();
  return true;
 }
 //给自定义开关控件设置监听的方法
 public void setOnToggleStateLinstener(OnToggleStateChangeListener listen){
  mToggleStateChangeListener = listen;
 }
 public void setToggleState(boolean b) {
  toggle_state = b;
 }
 //监听回调接口,方法由实现接口的类实现
 public interface OnToggleStateChangeListener {
  public void onToggleState(boolean state);
 }
}

到此,我们的自定义控件部分的逻辑就写完了,,借下来再MainActivity中调用一下


package com.hss.toggle;
import android.app.Activity;
import android.os.Bundle;
import com.hss.toggle.ToggleView.OnToggleStateChangeListener;
import com.hss.toggle.utils.ToastUtil;
public class MainActivity extends Activity{
 private ToggleView toggleView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  toggleView = (ToggleView) findViewById(R.id.toggleView);
  toggleView.setOnToggleStateLinstener(new OnToggleStateChangeListener() {
   @Override
   public void onToggleState(boolean state) {
    showToast(state);
   }
  });
 }
 //这里调用到的自己封装的一个快速弹Toast的工具类
 private void showToast(boolean state) {
  ToastUtil.makeSuddenlyToast(getApplicationContext(), state?"开":"关");
 }
}

ToastUtil类如下:


package com.hss.toggle.utils;
import android.content.Context;
import android.widget.Toast;

public class ToastUtil {
 private static Toast toast;
 
 public static void makeShortToast(Context context,String text){
  toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
  toast.show();
 }
 
 public static void makeLongToast(Context context,String text){
  toast = Toast.makeText(context, text, Toast.LENGTH_LONG);
  toast.show();
 }
 
 public static void makeSuddenlyToast(Context context,String text){
  if(toast==null){
   toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
  }
  toast.setText(text);
  toast.show();
 }
}

总结一下,其实本次自定义控件的步骤如下:
1、在values/attrs.xml自定义属性和属性值的数据类型
2、在Java代码中定义自定义控件类,继承View或者ViewGroup或者Android原生的控件,实现构造方法,获取到自定义属性的值,并且编写对应的逻辑和点击事件。
3、在布局文件中使用自定义控件和自定义属性(注意命名空间)。
4、在MainActivity中调用

您可能感兴趣的文章:android开发教程之switch控件使用示例Android UI控件Switch的使用方法Android开关控件Switch的使用案例Android 自定义Switch开关按钮的样式实例详解Android UI设计系列之自定义SwitchButton开关实现类似iOS中UISwitch的动画效果(2)android自定义开关控件-SlideSwitch的实例Android自定义控件之开关按钮学习笔记分享Android开发进阶自定义控件之滑动开关实现方法【附demo源码下载】Android开发实现Switch控件修改样式功能示例【附源码下载】


--结束END--

本文标题: Android自定义控件实现滑动开关效果

本文链接: https://www.lsjlt.com/news/24573.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android自定义控件实现简单滑动开关效果
    本文实例为大家分享了Android自定义控件实现简单滑动开关的具体代码,供大家参考,具体内容如下 ToggleButton 滑动开关 项目概述 滑动开关是一个纯粹的自定义控件,上面的...
    99+
    2024-04-02
  • Android自定义view实现滑动解锁效果
    本文实例为大家分享了Android自定义view实现滑动解锁的具体代码,供大家参考,具体内容如下 1. 需求如下: 近期需要做一个类似屏幕滑动解锁的功能,右划开始,左划暂停。 2. ...
    99+
    2024-04-02
  • Android自定义双向滑动控件
    本文实例为大家分享了Android自定义双向滑动控件的具体代码,供大家参考,具体内容如下 先看一下效果图 1.SeekBarPressure工具类 public class See...
    99+
    2024-04-02
  • Android自定义View实现竖向滑动回弹效果
    本文实例为大家分享了Android自定义View实现滑动回弹的具体代码,供大家参考,具体内容如下 前言 Android 页面滑动的时候的回弹效果 一、关键代码 public clas...
    99+
    2024-04-02
  • Android自定义控件实现雷达图效果
    本文实例为大家分享了Android自定义控件实现雷达图的具体代码,供大家参考,具体内容如下 学习了大神的源代码(奈何不知大神的博客地址),觉得必须记录一下,方便以后再次学习。 效果如...
    99+
    2024-04-02
  • 基于Android自定义控件实现雷达效果
    如何制作出类似雷达扫描的效果,具体方法如下一、效果图二、实现思路 自定义控件RadarView用来画雷达的效果图,可以自定义属性包括 backgroundColor:背景颜色 circleNum:圆的数量 startColor:开始颜色 e...
    99+
    2023-05-30
    android 雷达 roi
  • Android自定义view实现滑动解锁九宫格控件
    目录前言需求效果图前言 上一篇文章用贝塞尔曲线画了一个看起来不错的小红点功能,技术上没什么难度,主要就是数学上的计算。这篇文章也差不多,模仿了一个常用的滑动解锁的九宫格控件。 需求 ...
    99+
    2023-02-09
    Android滑动解锁九宫格 Android滑动解锁 Android九宫格控件
  • Android怎么自定义双向滑动控件
    这篇文章主要介绍“Android怎么自定义双向滑动控件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么自定义双向滑动控件”文章能帮助大家解决问题。先看一下效果图1.SeekBarPr...
    99+
    2023-06-30
  • Android怎么自定义View实现竖向滑动回弹效果
    这篇文章主要介绍“Android怎么自定义View实现竖向滑动回弹效果”,在日常操作中,相信很多人在Android怎么自定义View实现竖向滑动回弹效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Andro...
    99+
    2023-06-30
  • android怎么自定义开关控件
    要自定义开关控件,可以使用以下步骤:1. 创建一个自定义的开关控件类,继承自Switch或CompoundButton类。2. 在自...
    99+
    2023-08-16
    android
  • C#实现滑动开关效果
    C#重绘checkbox生成滑动开关,供大家参考,具体内容如下 通过调用checkbox控件的paint事件,在重绘事件里判断checked属性,如果选中绘制选中图形,如果未选中绘制...
    99+
    2024-04-02
  • Android如何自定View实现滑动验证效果
    本篇内容主要讲解“Android如何自定View实现滑动验证效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android如何自定View实现滑动验证效果”吧!效果图自定义属性代码<xm...
    99+
    2023-06-22
  • Android自定义View实现拖动自动吸边效果
    本文实例为大家分享了Android自定义View实现拖动自动吸边的具体代码,供大家参考,具体内容如下 自定义View,一是为了满足设计需求,二是开发者进阶的标志之一。随心所欲就是我等...
    99+
    2024-04-02
  • 通过在Android中自定义StickinessView实现一个粘性滑动效果
    这篇文章给大家介绍通过在Android中自定义StickinessView实现一个粘性滑动效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、首先,要确定HeadLayout什么时候可以拦截事件,那么就要确定List...
    99+
    2023-05-31
    android stickinessview roi
  • 怎么在Android中通过自定义view实现滑动解锁效果
    怎么在Android中通过自定义view实现滑动解锁效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。自定义view如下@SuppressLint("Clicka...
    99+
    2023-06-15
  • Android自定义滑动解锁控件使用详解
    最近的项目里用到了,在网上找不到合适的,于是自己写了个简单的,带回弹效果:可以自定义的属性有:<!-- 滑动解锁控件 xml配置属性 --><declare-styleable name="SlideToUnlockVie...
    99+
    2023-05-30
    android 滑动解锁 roi
  • Android自定View实现滑动验证效果的代码
    效果图 自定义属性代码 <?xml version="1.0" encoding="utf-8"?> <resources> &...
    99+
    2024-04-02
  • Android自定义View实现动画效果详解
    目录帧动画补间动画属性动画帧动画 帧动画就是给定一个完整动画的所有关键帧,由大脑想象中间的变化过程的一种动画。 <xml version="1.0" encoding="utf...
    99+
    2023-02-02
    Android自定义View实现动画 Android 动画 Android自定义View
  • Android中怎么通过自定义RecyclerView控件实现Gallery效果
    这期内容当中小编将会给大家带来有关Android中怎么通过自定义RecyclerView控件实现Gallery效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、RecyclerView的基本用法首先主...
    99+
    2023-05-30
    android recyclerview gallery
  • android自定义左侧滑出菜单效果
    这里给大家提供一个类似QQ聊天那种可以左侧滑出菜单的自定义控件。希望对大家有帮助。参考了一些网友的做法,自己整理优化了一下,用法非常简单,就一个类,不需要自己写任何的代码,只要添加上...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作