使用Swith遇到的问题

1、项目开发中需要用到滑块开关,于是使用了github中的一个Material Design风格的开源控件,使用起来挺好的,但是后来发现app耗电高,使用adb shell top | grep packagename查看app的资源占用情况,发现一直占用20%左右的cpu;使用Eclipse的DDMS查看Update Threads,发现是主线程中user的操作一直在进行,后来发现开源控件在onDraw()方法中一直调用invalidate()方法导致控件重绘,重绘中会创建Bitmap。

2、于是想修改此控件,不让它重绘,仅仅在状态改变或者滑动的时候重绘,发现控件显示会出问题,是开源控件本身的bug,更新了github中最新代码,发现其修复了一些问题,但是onDraw()中invalidate()方法导致一直重绘的问题仍然没有修复。

3、在同事的建议下使用android自带的Switch控件,此控件是在android4.0之后添加的。由于是系统自带的控件,所以在不同的手机上显示的效果会受手机ROM风格的影响,为了消除这种影响,需要设置Switch的一些属性,主要是滑块的track和thumb,前者是滑道,后者是滑块。

4、想仿照开源控件的样式定义drawable用作Switch的track和thumb,即track是一条线,thumb是一个圆。用drawable定义好track、thumb后,在xml中设置其track和thumb属性,结果发现只能看到track线,无法看到thumb。我不清楚为何,手边有一本《疯狂android讲义》,里面也是这么设置的。我将thumb用一张图片代替,发现图片只能显示track线那么高的部分,于是我猜测thumb受track高度的影响,我将drawable中的track高度增大,运行代码,发现还真是这样。

5、于是使用photoshop画track,使用drawable画thumb,因为track是一条线,而且上下有边距,我用drawable无法实现。thumb是圆形,用drawable画出后,设置Switch的属性,但是实际运行的效果是:track是对的,但是thumb是椭圆,检查代码,没有错误。于是只好曲线救国:设置Switch的属性textOff、textOn为空,设置thumbTextPadding为thumb的半径,显示正确。

6、xml代码
1)、switch.xml

<Switch
    android:id="@+id/switch_connect"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="8dp"
    android:checked="false"
    android:switchMinWidth="45dp"
    android:switchPadding="0dp"
    android:textOff=""
    android:textOn=""
    android:thumb="@drawable/main_switch_thumb"
    android:thumbTextPadding="10dp"
    android:track="@drawable/main_switch_track" >
</Switch>

2)、main_switch_thumb.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false"><shape android:shape="oval">
            <solid android:color="#f2866a" />
        </shape></item>
    <item android:state_checked="true"><shape android:shape="oval">
            <solid android:color="#ee5a36" />
        </shape></item>
    <item android:state_checked="false"><shape android:shape="oval">
            <solid android:color="#b0b0b0" />
        </shape></item>
</selector>

3)、main_switch_track.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_main_switch_track_disable" android:state_enabled="false"></item>
    <item android:drawable="@drawable/ic_main_switch_track_check" android:state_checked="true"></item>
    <item android:drawable="@drawable/ic_main_switch_track_uncheck" android:state_checked="false"></item>
</selector>

7、广告

  • 手机如何连电脑?
  • 如何与电脑互发文件?
  • 如何与电脑互发文字?
  • 如何推送通知到电脑?
  • 电脑如何远程控制手机的相机?

快牙网传——全部搞定!

不想试试吗?
在豌豆荚等应用商店搜索“快牙网传“,或立即下载 Apk,也可以扫码下载。
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,switch case语句是一种用于多分支选择的语句。它可以根据一个表达式的值,从多个选项中选择一个执行。以下是Java中使用switch case语句的基本语法: ``` switch(expression) { case value1: // 执行代码块 1 break; case value2: // 执行代码块 2 break; ... default: // 执行默认代码块 } ``` 其中,expression是一个表达式,它的值将与每个case子句中的值进行比较。如果expression的值与某个case子句中的值相等,则执行该case子句中的代码块。如果没有匹配的case子句,则执行default子句中的代码块(如果有)。 在每个case子句中,可以编写要执行的代码块,并使用break语句来终止switch语句。如果没有break语句,则会继续执行下一个case子句中的代码块,直到遇到break语句或switch语句结束为止。 以下是一个简单的示例,演示如何使用switch case语句: ``` int day = 3; String dayName; switch (day) { case 1: dayName = "Monday"; break; case 2: dayName = "Tuesday"; break; case 3: dayName = "Wednesday"; break; case 4: dayName = "Thursday"; break; case 5: dayName = "Friday"; break; case 6: dayName = "Saturday"; break; case 7: dayName = "Sunday"; break; default: dayName = "Invalid day"; break; } System.out.println(dayName); ``` 在上面的示例中,我们使用switch case语句根据一个整数值来选择一天的名称。如果day的值为3,则输出"Wednesday"。如果day的值不在1到7之间,则输出"Invalid day"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值