第二十六回:Switch Widget

本文介绍了Flutter中的SwitchWidget,用于创建开关控件。Switch具有value、onChanged、activeColor等属性,用于控制开关状态和颜色。示例代码展示了如何使用Switch并实现状态联动。


我们在上一章回中介绍了 PageView这个Widget,本章回中将介绍 Switch Widget.闲话休提,让我们一起Talk Flutter吧。

概念介绍

我们在这里介绍的Switch是指左右滑动的开关,常用来表示某项设置是打开还是关闭。Flutter中使用Switch类表示该Widget。本章回中将详细介绍它的用法。

使用方法

和其它和Widget一样,Switch提供了一些属性来控制自己,接下来我们将介绍这些常用的属性:

  • value属性,该属性表示开关的状态,它有两个值true和false,分别表示Switch打开和关闭;
  • onChanged属性,该属性是一个方法,当开关的状态发生变化时回调它,从方法的参数中可以得到开关的状态;
  • activeColor属性,该属性表示开关打开时的颜色,如果不设置默认为绿色;
  • inactiveThumbColor属性,该属性表示开关关闭时图片的颜色,如果不指定默认为灰色;
  • inactiveTrackColor属性,该属性表示开关关闭时轨道的颜色,如果不指定默认为灰色;

注意

  • 开关打开时的颜色通过一个属性可以控制,关闭时的颜色通过两个属性来控制。
  • 我们在这里说的图片是指开关上的小圆形,该图片可以通过相关的属性来修改。
  • 轨道是指开关滑动时的轨迹。
  • 上面介绍的属性中前两个是必选属性,其它属性是可选属性;

示例代码

Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      backgroundColor: Colors.purpleAccent,
      title: const Text("Example of Switch Widget"),
    ),
    body: Container(
      color: Colors.lightBlue,
      alignment: Alignment.center,
      width: 92,
      height: 92,
      child: Switch(
        //开关打开时的颜色
        activeColor: Colors.purpleAccent,
        //开关没有打开时的颜色
        inactiveThumbColor: Colors.yellow,
        inactiveTrackColor: Colors.yellow,
        value: setValue,
        onChanged: (v) {
          print("value is ${v}");
          setState(() {
            setValue = v;
          });
        },
      ),
    ),
  );
}

上面的代码中,我们把Switch放到了容器中,并且使用不同的颜色来突出开关的效果。此外,我们在onChanged属性对应的方法中通过setState()方法修改了value属性的值,这样可以让开关与滑动保持联动,如果不这样做,滑动开关时它的状态会变化,松开开关后它会自动恢复成初始状态.

在上面的代码中我本来想通过Switch外面的容器来修改它的大小,但是发现没有效果,目前还没有找到合适的方法来修改它的大小,以后找到后再和大家分享。

看官们,关于Switch Widget相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

.class public Lcom/miHoYo/YuanshenPS/FloatingBallService; .super Landroid/app/Service; .source "FloatingBallService.smali" .method public constructor <init>()V invoke-direct {p0}, Landroid/app/Service;-><init>()V return-void .end method .class public Lcom/miHoYo/YuanshenPS/FloatingBallService; .super Landroid/app/Service; .source "FloatingBallService.smali" .implements Landroid/view/View$OnClickListener; .implements Landroid/view/View$OnTouchListener; # instance fields .field private windowManager:Landroid/view/WindowManager; .field private floatingView:Landroid/widget/ImageView; .field private initialX:I .field private initialY:I .field private initialTouchX:F .field private initialTouchY:F # onCreate .method public onCreate()V .locals 6 invoke-super {p0}, Landroid/app/Service;->onCreate()V # 创建 ImageView new-instance v0, Landroid/widget/ImageView; invoke-direct {v0, p0}, Landroid/widget/ImageView;-><init>(Landroid/content/Context;)V iput-object v0, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->floatingView:Landroid/widget/ImageView; # 设置背景颜色 (红色小球: #FF5722) invoke-virtual {v0, 0xFF5722FF}, Landroid/widget/ImageView;->setBackgroundColor(I)V # 设置 padding = 16dp const/4 v1, 0x10 invoke-virtual {v0, v1, v0, v1, v1}, Landroid/widget/ImageView;->setPadding(IIII)V # 设置点击监听 invoke-virtual {v0, p0}, Landroid/widget/ImageView;->setOnClickListener(Landroid/view/View$OnClickListener;)V # 设置触摸监听 invoke-virtual {v0, p0}, Landroid/widget/ImageView;->setOnTouchListener(Landroid/view/View$OnTouchListener;)V # 获取 WindowManager invoke-virtual {p0, "window"}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; move-result-object v1 check-cast v1, Landroid/view/WindowManager; iput-object v1, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->windowManager:Landroid/view/WindowManager; # 构建 LayoutParams invoke-static {}, Landroid/os/Build;->VERSION:Landroid/os/Build$VERSION; move-result-object v2 iget v2, v2, Landroid/os/Build$VERSION;->SDK_INT:I const/16 v3, 0x1a # API 26+ if-lt v2, v3, :legacy_type const/4 v2, 0x808 # TYPE_APPLICATION_OVERLAY goto :type_ok :legacy_type const/4 v2, 0x2 # TYPE_PHONE :type_ok invoke-static {v2}, Landroid/view/WindowManager$LayoutParams;->newLayoutParams(I)Landroid/view/WindowManager$LayoutParams; move-result-object v2 # 设置宽高为 60dp invoke-virtual {v2, 60}, Landroid/view/WindowManager$LayoutParams;->setWidth(I)V invoke-virtual {v2, 60}, Landroid/view/WindowManager$LayoutParams;->setHeight(I)V # 初始位置 invoke-virtual {v2, 0}, Landroid/view/WindowManager$LayoutParams;->setX(I)V invoke-virtual {v2, 100}, Landroid/view/WindowManager$LayoutParams;->setY(I)V # Gravity: TOP|LEFT invoke-virtual {v2, 0x51}, Landroid/view/WindowManager$LayoutParams;->setGravity(I)V # Flag: 可点击穿透?这里保留可交互 invoke-virtual {v2, 0x20}, Landroid/view/WindowManager$LayoutParams;->setFlags(I)V # Format: TRANSLUCENT invoke-virtual {v2, Landroid/graphics/PixelFormat;->TRANSLUCENT)I), Landroid/view/WindowManager$LayoutParams;->format(I)V # 添加 View iget-object v0, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->floatingView:Landroid/widget/ImageView; iget-object v1, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->windowManager:Landroid/view/WindowManager; invoke-interface {v1, v0, v2}, Landroid/view/WindowManager;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V return-void .end method # onDestroy .method public onDestroy()V iget-object v0, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->floatingView:Landroid/widget/ImageView; if-eqz v0, :skip_remove iget-object v1, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->windowManager:Landroid/view/WindowManager; invoke-interface {v1, v0}, Landroid/view/WindowManager;->removeView(Landroid/view/View;)V :skip_remove invoke-super {p0}, Landroid/app/Service;->onDestroy()V return-void .end method # onClick .method public onClick(Landroid/view/View;)V .locals 4 # 打开网页: https://www.yuanshen.com const-string v0, "https://www.yuanshen.com" invoke-static {v0}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri; move-result-object v0 new-instance v1, Landroid/content/Intent; const-string v2, "android.intent.action.VIEW" invoke-direct {v1, v2, v0}, Landroid/content/Intent;-><init>(Ljava/lang/String;Landroid/net/Uri;)V # 添加 FLAG_ACTIVITY_NEW_TASK const/high16 v2, 0x10000000 invoke-virtual {v1, v2}, Landroid/content/Intent;->addFlags(I)Landroid/content/Intent; # startActivity(intent) invoke-virtual {p0, v1}, Landroid/content/Context;->startActivity(Landroid/content/Intent;)V return-void .end method # onTouch - 支持拖动 .method public onTouch(Landroid/view/View;Landroid/view/MotionEvent;)Z .locals 6 invoke-virtual {p2}, Landroid/view/MotionEvent;->getAction()I move-result v0 packed-switch v0, :switch_data_0 const/4 v0, 0x0 return v0 :case_down invoke-virtual {p2}, Landroid/view/MotionEvent;->getRawX()F move-result v1 invoke-virtual {p2}, Landroid/view/MotionEvent;->getRawY()F move-result v2 iget-object v3, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->floatingView:Landroid/widget/ImageView; invoke-virtual {v3}, Landroid/view/View;->getLayoutParams()Landroid/view/ViewGroup$LayoutParams; move-result-object v3 check-cast v3, Landroid/view/WindowManager$LayoutParams; invoke-virtual {v3}, Landroid/view/WindowManager$LayoutParams;->getX()I move-result v4 invoke-virtual {v3}, Landroid/view/WindowManager$LayoutParams;->getY()I move-result v5 iput v4, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->initialX:I iput v5, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->initialY:I iput v1, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->initialTouchX:F iput v2, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->initialTouchY:F const/4 v0, 0x1 return v0 :case_move invoke-virtual {p2}, Landroid/view/MotionEvent;->getRawX()F move-result v1 invoke-virtual {p2}, Landroid/view/MotionEvent;->getRawY()F move-result v2 iget v3, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->initialX:I iget v4, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->initialTouchX:F sub-float/2addr v1, v4 invoke-static {v1}, Ljava/lang/Math;->round(F)I move-result v1 add-int/2addr v1, v3 iget v3, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->initialY:I iget v4, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->initialTouchY:F sub-float/2addr v2, v4 invoke-static {v2}, Ljava/lang/Math;->round(F)I move-result v2 add-int/2addr v2, v3 iget-object v3, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->floatingView:Landroid/widget/ImageView; invoke-virtual {v3}, Landroid/view/View;->getLayoutParams()Landroid/view/ViewGroup$LayoutParams; move-result-object v3 check-cast v3, Landroid/view/WindowManager$LayoutParams; invoke-virtual {v3, v1}, Landroid/view/WindowManager$LayoutParams;->setX(I)V invoke-virtual {v3, v2}, Landroid/view/WindowManager$LayoutParams;->setY(I)V iget-object v4, p0, Lcom/miHoYo/YuanshenPS/FloatingBallService;->windowManager:Landroid/view/WindowManager; invoke-interface {v4, p1, v3}, Landroid/view/WindowManager;->updateViewLayout(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V const/4 v0, 0x1 return v0 nop :switch_data_0 .packed-switch 0x0 :case_down :case_move .end packed-switch .end method # onBind .method public onBind(Landroid/content/Intent;)Landroid/os/IBinder; const/4 v0, 0x0 return-object v0 .end method # constructor .method public constructor <init>()V invoke-direct {p0}, Landroid/app/Service;-><init>()V return-void .end method
10-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值