首页 > 其他分享 >Android开发学习之路--Drawable mutations

Android开发学习之路--Drawable mutations

时间:2023-01-15 15:00:32浏览次数:64  
标签:test1 test2 layout -- mutations seekBar Android id android


  时间过得很快,明天终于可以拿到房子了,交完这次房租,也可以成为房东了,看看博客也好久没有更新了,最近一直在整机器人,也没有太多时间整理博客。
  今天下午和同事一起遇到了一个问题,就是明明没有改变一个控件的alpha值,但是这个控件的透明度居然变了。甚是奇怪之余,大神在stackoverflow上去提了问题,最后也有另外的大神给了正确的回复。
  最终我们知道了是android的Drawable mutations的一些小细节问题,具体的可以参考​​​一篇讲解Drawable mutations很好的文章​​​。
  其实是android为了节省内存,把资源给共享了,如果两个控件的drawable使用了相同的资源,可能是相同的图片资源,可能是相同的颜色,或者其他。
  可能还是不是非常理解,那我们就来个例子吧,首先我们新建个activity的layout文件,如下:

<Button
android:id="@+id/test1"
android:layout_width="80dp"
android:layout_height="100dp"
android:background="@android:color/holo_green_dark"
android:text="tes1"/>

<Button
android:id="@+id/test2"
android:layout_width="100dp"
android:layout_height="80dp"
android:layout_marginTop="10dp"
android:background="@android:color/holo_green_dark"
android:text="test2" />

<SeekBar
android:id="@+id/seekBar_1"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="255"/>

  这里省略了,只显示需要的控件,其中test1和test2的background是一样的,然后seeker是之后为了改变透明度使用。那就开始写测试的代码吧:

Button test1 = (Button)findViewById(R.id.test1);
Button test2 = (Button)findViewById(R.id.test2);

SeekBar seekBar = (SeekBar)findViewById(R.id.seekBar_1);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
test1.getBackground().setAlpha(255-progress);
test2.invalidate();
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}

  这里通过拖动seekbar,然后改变button1的alpha值,这里没有设置button2的alpha,只是button2刷新了下。可以看下效果:




Android开发学习之路--Drawable mutations_android


  显然我们没有设置button2的background,那为什么button2的背景透明度也变换了呢?其实就是如上所说的资源共享了,两个button,我们都用了同一个的颜色,所以系统把公用了同一个颜色的资源,那么当我们改变button1的颜色的时候,button2的alpha值也会跟着改变。
  但是很多时候我们确实需要只改变一个控件的状态而不是改变两个,那要怎么处理呢?这就是这里要讲的mutations了,mutation意为变化,突变的意思,这里如果使用mutation的话,那么就会只改变一个颜色了,那么我们修改i下代码:

test1.getBackground().mutate().setAlpha(255-progress);

  修改设置alpha的方法,使用mutate()方法,然后运行看下效果:



Android开发学习之路--Drawable mutations_android_02


  如上图,我们得到了很好的实践。


标签:test1,test2,layout,--,mutations,seekBar,Android,id,android
From: https://blog.51cto.com/u_15940062/6008720

相关文章

  • 常见算法的拓展
    \(\large\text{Floyed--最小环}\)题目链接思路:枚举环上一条路径\(i\)至\(j\),那么该环一定由是一条\(k\)至\(i\)的边和该路径再加\(j\)至\(k\)的边。在取最......
  • hyper-v 尝试检索虚拟交换机列表时出错
    百度了一下找不到答案,经过一通折腾好了,具体如何好的不清楚。1卸载desktopdocker如果还不行再执行下面的2在启动/关闭windows功能中卸载hyper-v卸载适用于Linux的w......
  • Android开发学习之路--基于vitamio的视频播放器(二)
      终于把该忙的事情都忙得差不多了,接下来又可以开始goodgoodstudy,daydayup了。在​​Android开发学习之路–基于vitamio的视频播放器(一)​​中,主要讲了播放器的界面的......
  • 第8章 使用标记帮助工具构建表单(ASP.NET Core in Action, 2nd Edition)
    本章包括使用TagHelpers轻松构建表单使用锚标记帮助程序生成URL使用TagHelpers为Razor添加功能在第7章中,您了解了Razor模板以及如何使用它们为应用程序生成视图。......
  • 服务调用OpenFeign
    1、介绍①什么是OpenFeignOpenFeign是在Feign的基础上进行了加强使用在Client-Consuemr(消费者客户端)Fiegn是一个声明式的Web服务客户端,让编写Web服务客户端非常容易,只......
  • 二穗短柄草
    禾本科木聚糖中的一些阿拉伯呋喃糖是间隔均匀的,葡萄糖醛酸的修饰是成簇分布的。在芒属茎秆木聚糖中,阿拉伯呋喃糖的平均取代频率是11%,葡萄糖醛酸的替代是5%左右,但是这种取......
  • 中科大每日健康打卡平台的自动打卡脚本
    健康打卡脚本基本就是复现该大佬的工作,这是博客用Python实现中科大健康打卡脚本-逸風亭(fyz666.xyz)这是GitHub源码库GitHub-windshadow233/USTC-Auto-Health-Repor......
  • 迭代加深
    迭代加深迭代加深是用于优化搜索的,因为dfs的过程中是选择搜索的一个分支,不断地深入,直到我们达到递归的边界时才会返回。这样的话,如果搜索树的分支比较多,但答案在比较浅的......
  • Linux后台运行
    title:Linux后台运行date:2022-09-0312:51:35tags:-Linuxcategories:-Linux如何后台运行脚本方法1:nohup在执行命令前面加nohup但是CTRL+C就......
  • Web 开发人员日常工作的一天记录 All In One
    Web开发人员日常工作的一天记录AllInOneWeb开发人员每天做在什么?如果您要成为Web开发人员,您可能想知道会发生什么!你每天的生活会是什么样子?你会和谁一起工作?你......