开关案例

news/2025/5/19 23:09:00

开关案例

  • 代码实现步骤 
  • [1]先在构造方法里面获取2张背景图片的宽和高
    public ToggleView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);tbg = BitmapFactory.decodeResource(getResources(), R.drawable.toogle_background);sbg = BitmapFactory.decodeResource(getResources(), R.drawable.toogle_slidebg);slideMax = tbg.getWidth() - sbg.getWidth();String namespace = "http://schemas.android.com/apk/res-auto";boolean isOpen = attrs.getAttributeBooleanValue(namespace, "state", false);setOpenState(isOpen);if (state) {toLeft = slideMax;} else {toLeft = 0;}}

 

[2]重写onMeasure方法对当前view进行测量 当前view的宽高和toogleBg 一样

    @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(tbg.getWidth(), tbg.getHeight());}

 

[3]重写onDraw方法往当前的view上画内容 其实就是画图片

    @Overrideprotected void onDraw(Canvas canvas) {canvas.drawBitmap(tbg, 0, 0, null);canvas.drawBitmap(sbg, toLeft, 0, null);if (isUp) {isUp = false;boolean isOpenTemp = toLeft > 0;if (isOpenTemp != state && listener != null) {listener.setState(isOpenTemp);state = isOpenTemp;}}}

 

[4]给开关定义监听事件 具体什么时候出发回调事件:

    public void setOnStateListener(OnStateListener listener) {this.listener = listener;}public interface OnStateListener {void setState(boolean isOpen);}

 

[5]处理滑动块滑动的逻辑 重写onTouchEvent方法 处理手指按下和移动的逻辑

    @Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN://按下的距离downX = event.getX();break;case MotionEvent.ACTION_MOVE:endX = event.getX();moveX = endX - downX;toLeft = toLeft + moveX;if (toLeft <= 0) {toLeft = 0;}if (toLeft >= slideMax) {toLeft = slideMax;}downX = endX;break;case MotionEvent.ACTION_UP:isUp = true;float tHalf = tbg.getWidth() / 2;float sHalf = toLeft + sbg.getWidth() / 2;if (tHalf > sHalf) {toLeft = 0;} else {toLeft = slideMax;}break;}invalidate();return true;}

 

[6]处理手指抬起的业务逻辑

            case MotionEvent.ACTION_UP:isUp = true;float tHalf = tbg.getWidth() / 2;float sHalf = toLeft + sbg.getWidth() / 2;if (tHalf > sHalf) {toLeft = 0;} else {toLeft = slideMax;}break;

 

[7]实现开关的功能.

        if (isUp) {isUp = false;boolean isOpenTemp = toLeft > 0;if (isOpenTemp != state && listener != null) {listener.setState(isOpenTemp);state = isOpenTemp;}}

 

[8]自定义开关的属性

8.1)在res下定义一个attrs文件

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="ToggleView"><attr name="state" format="boolean" /></declare-styleable>
</resources>

 

8.2)自己声明一个命名空间.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:toogle="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ngyb.choose.ToggleViewandroid:id="@+id/tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"toogle:state="true" />
</LinearLayout>

 

8.3)在构造方法里面获取我们声明的属性值

        String namespace = "http://schemas.android.com/apk/res-auto";boolean isOpen = attrs.getAttributeBooleanValue(namespace, "state", false);

 

 

 8.4)更新开关的状态

    public void setOpenState(boolean openState) {isUp = true;this.state = openState;}

https://github.com/nangongyibin7219/Android_OnOff

转载于:https://www.cnblogs.com/nangongyibin/p/10322973.html

文章来源:https://blog.csdn.net/weixin_33928137/article/details/93347441
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-2328196.html

相关文章

libvirt hypervisors信息采集

libvirt hypervisors信息采集 libvirt采集hypervisors信息的通用格式 driver[transport]://[username][hostname][:port]/[path][?extraparameters] http://community.zenoss.org/docs/DOC-4687 【zenoss监控hypervisors】 Libvirt默认设置下是不支持TCP连接的&#xff0c;需要…

python编程---example18

请使用OrderDict类来重写这个程序&#xff0c;并确认输出的顺序与你在字典中添加键-值对的顺序一致。 from collections import OrderedDictglossary OrderedDict()glossary[string] A series of characters. glossary[comment] A note in a program that the Python inte…

通过终端生成plist文件

1.打开终端进入桌面cd Desktop ,回车2.vim Text.plist (要创建的plist文件) ,回车3.再按esc4.再按shift:5.敲上wq! ,回车 &#xff0c;就在桌面生成了plist文件了打开plistvim plist的路径(显示简介得到路径)浏览plistcat plist的路径vi命令&#xff1a;http://www.21ds.net/…

近5年常考Java面试题及答案整理(一)

下列面试题都是在网上收集的&#xff0c;本人抱着学习的态度找了下参考答案&#xff0c;有不足的地方还请指正。 1、面向对象的特征有哪些方面&#xff1f; 抽象&#xff1a;将同类对象的共同特征提取出来构造类。继承&#xff1a;基于基类创建新类。封装&#xff1a;将数据隐藏…

DACD 测试链发行资产记录

2019独角兽企业重金招聘Python工程师标准>>> 1、数字资产信任网关&#xff08;信任网关才可进行资产转账&#xff09; sudo ./dacd submit xhw7v3VNVUhT4ovMX8ADcNoiLWaDD返回结果&#xff1a;{"Account":"zf4cFDSdGms8kWENAD2GX7pNz4NvxRsJgt"…

Linux平台Firefox Flash插件安装方法

flash player插件可到Adobe官网下载。正常情况下&#xff0c;在firefox目录中创建一个plugins目录&#xff0c;将libflashplayer.so文件拷贝进去即可。mkdir /opt/firefox/pluginscp libflashplayer.so /opt/firefox/plugins在不同版本&#xff0c;要求放的位置也不同&#xff…

一文讲透前端开发所需网络知识

UDP 面向报文 UDP 是一个面向报文&#xff08;报文可以理解为一段段的数据&#xff09;的协议。意思就是 UDP 只是报文的搬运工&#xff0c;不会对报文进行任何拆分和拼接操作。 具体来说 在发送端&#xff0c;应用层将数据传递给传输层的 UDP 协议&#xff0c;UDP 只会给数据增…

第十九章:集合视图(七)

模板和单元格ListView的目的是显示数据。在现实世界中&#xff0c;数据无处不在&#xff0c;我们不得不编写计算机程序来处理这些数据。然而&#xff0c;在诸如本书的编程教程中&#xff0c;数据更难获得。因此&#xff0c;让我们发明一些数据来更深入地探索ListView&#xff0…

从零部署你的react博客跟koa后台服务

本教程环境 硬件配置&#xff1a;阿里云主机 域名 系统&#xff1a; centos7.4 使用到的软件有&#xff1a; navicat xshell5 如果需要购买域名以及服务器 请参考我另外一篇文章前半部分&#xff1a; 从零搭建nodejs服务器&#xff0c;配置域名解析https证书 &#xff08;以阿里…

[PC]PHPCMS v9.5.6整合UEditer1.4.2

----------------------------------------------------------------------------------------------- 首先去UEditor官网下载所需对应版本&#xff1a;http://ueditor.baidu.com/website/download.html 这里以1.4.2 PHP 版本&#xff0c;UTF-8版 为例> -------------------…