MotionLayout自定义开关按钮实例详解

目录
  • MotionLayout自定义一个动画开关按钮
  • 使用方法
    • 完整代码直接拿去用

MotionLayout自定义一个动画开关按钮

MotionLayout是一个非常新的类,它来自ConstraintLayout 2.0库中,主要目的是为了帮助Android开发人员在应用中降低使用手势和组件动画的难度

使用方法

MotionSwitch(Modifier.height(26.dp).width(86.dp), onText = "最热", offText = "最新", onEvent = {
}, offEvent = {
})

完整代码直接拿去用

import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.layoutId
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.constraintlayout.compose.ConstraintSet
import androidx.constraintlayout.compose.ExperimentalMotionApi
import androidx.constraintlayout.compose.MotionLayout
import kotlin.math.roundToInt
/**
 * @Description:
 * @Author: JIULANG
 * @Data: 2022/11/6 16:27
 */
@ExperimentalMotionApi
@Composable
 fun MotionSwitch(
    modifier:Modifier =Modifier,
    check:Boolean =false,
    onText:String = "on",
    offText:String = "off",
    onEvent :()-> Unit,
    offEvent :()-> Unit,
) {
    var animateToEnd by remember { mutableStateOf(check) }
    val progress by animateFloatAsState(
        targetValue = if (animateToEnd) 1f else 0f,
        animationSpec = tween(1000)
    )
    var buttonSwitchHight  by remember { mutableStateOf(IntSize(0, 0)) }
    Column() {
        MotionLayout(
            ConstraintSet(
                """ {
                backgroundSwitch: {
                    custom: {
                      color: "#d2d2d2"
                    }
                },
                buttonSwitch: {
                    top: ['backgroundSwitch', 'top', 0],
                    start: ['backgroundSwitch', 'start', 0]
                },
                on: {
                    top: ['backgroundSwitch', 'top', 0],
                    start: ['backgroundSwitch', 'start', 0],
                    bottom: ['backgroundSwitch', 'bottom', 0]
                },
                off: {
                    top: ['backgroundSwitch', 'top', 0],
                    end: ['backgroundSwitch', 'end', 0],
                    bottom: ['backgroundSwitch', 'bottom', 0]
                }
             }"""
            ),
            ConstraintSet(
                """ {
                backgroundSwitch: {
                    custom: {
                      color: "#343434"
                    }
                },
                buttonSwitch: {
                    top: ['backgroundSwitch', 'top', 0],
                    end: ['backgroundSwitch', 'end', 0]
                },
                on: {
                    top: ['backgroundSwitch', 'top', 0],
                    start: ['backgroundSwitch', 'start', 0],
                    bottom: ['backgroundSwitch', 'bottom', 0]
                },
                off: {
                    top: ['backgroundSwitch', 'top', 0],
                    end: ['backgroundSwitch', 'end', 0],
                    bottom: ['backgroundSwitch', 'bottom', 0]
                }
              }"""
            ),
            progress = progress,
            modifier =modifier
        ) {
            Box(
                modifier = modifier
                    .layoutId("backgroundSwitch")
                    .clip(RoundedCornerShape(36.dp))
                    .onSizeChanged {
                        buttonSwitchHight = it
                    }
                    .clickable(onClick = {
                        if (animateToEnd){
                            onEvent.invoke()
                        }else{
                            offEvent.invoke()
                        }
                        animateToEnd = !animateToEnd })
                    .background(motionProperties("backgroundSwitch").value.color("color"))
            )
            Box(
                modifier = Modifier
                    .height(buttonSwitchHight.height.dp)
                    .width((buttonSwitchHight.width/5).dp)
                    .layoutId("buttonSwitch")
                    .clip(RoundedCornerShape(36.dp))
                    .background(Color.Gray)
            )
            Text(
                text = onText,
                modifier = Modifier
                    .layoutId("on")
                    .width((buttonSwitchHight.width/5).dp),
                color = Color.White,
                fontSize = 12.sp,
                textAlign = TextAlign.Center
            )
            Text(
                text = offText,
                modifier = Modifier
                    .layoutId("off")
                    .width((buttonSwitchHight.width/5).dp),
                color = Color.White,
                fontSize = 12.sp,
                textAlign = TextAlign.Center
            )
        }
    }
}

以上就是MotionLayout自定义开关按钮实例详解的详细内容,更多关于MotionLayout自定义开关按钮的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android自定义控件之开关按钮学习笔记分享

    今天来讲讲自定义单个控件,就拿开关按钮来讲讲,相信大家见了非常多这样的了,先看看效果: 我们可以看到一个很常见的开关按钮,那就来分析分析. 首先: 这是由两张图片构成: ①一张为有开和关的背景图片 ②一张为控制开和关的滑动按钮 第一步: 写个类继承View,并重写几个方法: 第一个为构造函数,重写一个参数的函数和两个参数的函数就够了,因为两个参数的函数能够使用自定义属性 第二个为控制控件的大小–>protected void onMeasure(int widthMeasureSpec, int

  • Android自定义开关按钮源码解析

    本文实例为大家分享了Android自定义开关的具体代码,供大家参考,具体内容如下 以 ToggleColorY 为例分析, ToggleImageY逻辑代码差不多 初始化参数 获取背景颜色,按钮颜色,开关状态 @SuppressLint("ResourceAsColor") private void initParame(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { TypedArray typed

  • Android实现史上最简单自定义开关按钮的方法

    目录 前言 一.原理 二.实现 1.自定义View类MyToggle 1)属性字段 2)覆写View类的构造方法 3)创建init方法 4)手指触摸事件回调方法onTouch 5)界面重绘方法onDraw 6)计算开关的宽高 7)设置图片资源信息 8)设置开关按钮的状态 9)自定义开关状态监听器 10)设置开关监听器 11)MyToggle完整代码如下: 2.MainActivity 3.布局文件activity_main.xml 4.AndroidManifest.xml 三.运行效果 四.温

  • Android自定义View实现开关按钮

    前言:Android自定义View对于刚入门乃至工作几年的程序员来说都是非常恐惧的,但也是Android进阶学习的必经之路,平时项目中经常会有一些苛刻的需求,我们可以在GitHub上找到各种各样的效果,能用则用,不能用自己花功夫改改也能草草了事.不过随着工作经验和工作性质,越来越觉得自定义View是时候有必要自己花点功夫研究一下. 一.经过这两天的努力,自己也尝试着写了一个Demo,效果很简单,就是开关按钮的实现. 可能有的人会说这效果so easy,找UI切三张图就完事了,何必大费周折自定义.

  • Android 自定义Switch开关按钮的样式实例详解

    封面 GitHub传送门 1.写在前面 本文主要讲的是在Android原生Switch控件的基础上进行样式自定义,内容很简单,但是在实现的过程中还是遇到了一些问题,在此记录下来,希望对大家能够有所帮助,看下效果图: 自定义样式 2.自定义样式 2.1 原生样式 首先看下原生的效果(Android 7.1): 原生效果 布局文件如下: <Switch android:layout_width="wrap_content" android:layout_height="wr

  • Android开发手册自定义Switch开关按钮控件

    目录 自定义Switch外观 布局样式 Drawable代码 自定义Switch外观 外观定制这块属于基操了,我们利用属性 android:track 和 android:thumb 定制 Switch 的背景图片和滑块图片,UI那能直接切图肯定做起来更快,此方式实现极其简单指定图片就行,所以今天我们实操的是自定义drawable的形式. 布局样式 <Switch android:layout_width="wrap_content" android:layout_height=

  • MotionLayout自定义开关按钮实例详解

    目录 MotionLayout自定义一个动画开关按钮 使用方法 完整代码直接拿去用 MotionLayout自定义一个动画开关按钮 MotionLayout是一个非常新的类,它来自ConstraintLayout 2.0库中,主要目的是为了帮助Android开发人员在应用中降低使用手势和组件动画的难度 使用方法 MotionSwitch(Modifier.height(26.dp).width(86.dp), onText = "最热", offText = "最新"

  • Android使用xml自定义图片实例详解

    Android使用xml自定义图片实例详解 实现效果图: 白色圆角图片 bg_round_rectangle_white.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-

  • Android启动内置APK和动态发送接收自定义广播实例详解

    Android启动内置APK和动态发送接收自定义广播实例详解 工作中遇到这样一个需求,需要为按键添加一个亲情号,提供一个接口启动内置的APK,思考再三决定更改Framework,利用广播机制去实现. 一.代码动态自主启动内置APK 我们都知道Android系统为我们提供了很多服务管理类,PackageManager主要是管理应用程序包,通过它就可以获取应用程序信息并构建Intent,启动对应的应用.除此之外Android还未我们提供了一些对应的类来管理相关的xml文件,比如说可以通过Packag

  • 微信小程序 自定义对话框实例详解

    微信小程序 自定义对话框实例详解 效果图: index.wxml: <button type="default" bindtap="clickbtn"> 点击 </button> <view class="commodity_screen" bindtap="hideModal" wx:if="{{showModalStatus}}"></view> <

  • Vue的土著指令和自定义指令实例详解

    1.土著指令 当我开始学习Vue的时候,看官网的时候看到了"指令"两个字.我愣住了,what?指令是啥啊?后来继续往下看,像这种什么"v-for""v-show""v-if"都叫做指令.等到后来Vue玩的差不多了,开始写项目的时候发现,常见的指令也就那么几个,比如"v-if""v-show""v-model""v-for""v-bind&

  • Angular1.x自定义指令实例详解

    本文实例讲述了Angular1.x自定义指令.分享给大家供大家参考,具体如下: 调用Module.directive方法,传入指令名称和工厂函数,返回一个对象. 指令名称中每个大写字母会被认为是属性名中的一个独立的词,而每个词之间是以一个连字符分隔的. var myApp = angular.module('myApp', []) .directive("unorderedList", function () { return function(scope, element, attr

  • GridView自定义分页实例详解(附demo源码下载)

    本文实例讲述了GridView自定义分页实现方法.分享给大家供大家参考,具体如下: CSS样式 首先把CSS样式代码粘贴过来: .gv { border: 1px solid #D7D7D7; font-size:12px; text-align:center; } .gvHeader { color: #3F6293; background-color: #F7F7F7; height: 24px; line-height: 24px; text-align: center; font-wei

  • jQuery实现的自定义滚动条实例详解

    本文实例讲述了jQuery实现的自定义滚动条.分享给大家供大家参考,具体如下: 可以自由的给滚动条定义背景,上下按钮,当然不仅仅是颜色,连图片当背景也可以.支持鼠标滚轮,点击滚动条滚轴定位,上下按钮久按加速,兼容 ie,firefox,chrome. 调用方法: $("#a").jscroll(); demo: <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset=

  • Android编程自定义组件实例详解

    本文实例讲述了Android编程自定义组件.分享给大家供大家参考,具体如下: 在Android中,所有的UI界面都是由View类和ViewGroup类及其子类组合而成.其中,View类是所有UI组件的基类,而ViewGroup类是容纳这些UI组件的容器. 其本身也是View类的子类. 在实际开发中,View类还不足以满足程序所有的需求.这时,便可以通过继承View类来开发自己的组件. 开发自定义组件的步骤: 1.创建一个继承android.view.View类的View类,并且重写构造方法. 2

  • jquery自定义组件实例详解

    缘起 我们知道在JQ中,是允许我们自定义一些插件与扩展的.定义的方式也比较简单,采用$.extend就行,那么下面就来看看在JQ中自定义一个插件的实例 JQuery如何封装一个组件 效果 我们先来看封装好的组件的效果图,这是一个根据组织机构选择人员的组件. 实现原理 我们先定义一个DbwSelectUser函数 DbwSelectUser : function (options) { var opt = $.extend({ //是否多选:true(多选),false(单选) multi:tru

随机推荐