`
LoveZhou
  • 浏览: 272441 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Drawable对象的mutate()方法为什么不起作用?

阅读更多
要在两个ImageView中显示用一张图片,而使它们的透明度不一样,利用Drawable对象的setAlpha()方法可以改变透明度,但是由于是同一张图片,底层只有一个Drawable对象,所以改变透明度的时候,所有显示的图片的透明度均会被更改,调用mutate()方法,可以使Drawable对象生成不同的constantstate对象,修改时就不会影响其它drawable对象的状态,但是调用后,不起作用,请会的朋友帮忙解答一下,先行谢过!
测试代码
package com.zhou.activity;

import android.app.Activity;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView;

public class DrawableActivity extends Activity {
    ImageView myImageView;
    ImageView myImageView2;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myImageView = (ImageView) this.findViewById(R.id.myImageView);
        myImageView2 = (ImageView) this.findViewById(R.id.myImageView2);
        
        //取得图片
        Resources res = this.getResources();
        Drawable drawable = res.getDrawable(R.drawable.link);
    
        //不透明
        drawable.mutate().setAlpha(255);
        myImageView.setImageDrawable(drawable);
        //透明
        drawable.mutate().setAlpha(55);
        myImageView2.setImageDrawable(drawable);
    }
} 

分享到:
评论
4 楼 LoveZhou 2012-07-20  
shaohuaabc123 写道
        //不透明 
        drawable.mutate().setAlpha(255); 
        myImageView.setImageDrawable(drawable); 
        //透明 
        Drawable drawable = res.getDrawable(R.drawable.link); 
        drawable.mutate().setAlpha(55); 
        myImageView2.setImageDrawable(drawable);
///这样修改应该可以

谢谢,我有空试一下
3 楼 shaohuaabc123 2012-07-19  
//不透明
        drawable.mutate().setAlpha(255);
        myImageView.setImageDrawable(drawable);
        //透明
        Drawable drawable1 = res.getDrawable(R.drawable.link);
        drawable1.mutate().setAlpha(55);
        myImageView2.setImageDrawable(drawable1);
///这样修改应该可以
2 楼 shaohuaabc123 2012-07-19  
        //不透明 
        drawable.mutate().setAlpha(255); 
        myImageView.setImageDrawable(drawable); 
        //透明 
        Drawable drawable = res.getDrawable(R.drawable.link); 
        drawable.mutate().setAlpha(55); 
        myImageView2.setImageDrawable(drawable);
///这样修改应该可以
1 楼 Cuba_Libre 2012-06-30  
怎么说呢,
你要设置两个drawable (d1,d2),然后再分别mutate.setAlpha(255或者55),这样不同了。
你可以试验下,不用mutate()的话,即使d1.setAlpha(255),当d2.setAlpha(55)的时候,d1的alpha也会变成55的,因为貌似setalpha是直接在改变引用对象的。

相关推荐

    (翻译) Android SDK文档之Drawable Mutations

    "Drawable Mutations"是关于如何管理和优化Drawable对象的一个关键概念,尤其是在处理多个引用相同Drawable对象的情况时。这篇博客文章可能深入解析了Android SDK文档中关于Drawable Mutations的细节。 Drawable ...

    自定义Drawable.zip

    开发者可以通过继承Drawable类或实现其接口来自定义自己的Drawable对象,以满足特定的设计需求。 接下来,我们来看如何自定义Drawable。自定义Drawable通常涉及以下几个关键方法: 1. `draw(Canvas canvas)`: 这是...

    Android属性动画——自定义Drawable(Robots)

    - 可选:实现`mutate()`和`clone()`方法,确保Drawable实例的独立性。 3. **结合属性动画**:在自定义Drawable中,我们可以为特定属性定义getter和setter方法,然后使用`ObjectAnimator`对这些属性进行动画操作。...

    android图片处理方法

    为此,我们需要调用`Drawable.mutate()`方法来创建可变的Drawable对象。以下是一个示例代码: ```java Drawable mDrawable = context.getResources().getDrawable(R.drawable.face_icon); // 将Drawable变为可变的...

    Android中使用背景色Alpha值遇到的一个坑

    尽管在打印`ColorDrawable`对象时,它们的hashcode不同,但这并不意味着它们是独立的实例。Android系统可能会为了性能优化而复用相同的颜色资源,从而导致更改一个控件的透明度会影响到所有使用该颜色的控件。 为了...

    开灯或者关灯

    - 使用`ObjectAnimator`:可以创建一个ObjectAnimator,目标对象为Drawable的`setLevel`方法,通过`ofInt()`传入一个值变化范围,来实现平滑的level过渡动画,从而达到开灯或关灯的动画效果。 - 使用`...

    Android getBackground().setAlpha遇到问题解决办法

    这是因为它们都是引用同一个Drawable对象,修改了它的状态,所有引用它的View都会受到影响。 为了解决这个问题,Android提供了一个名为`mutate()`的方法。调用`mutate()`可以使Drawable变为可变的,即不与其他...

    SlidingImageGallery图片旋转

    5. 优化性能:为了保证滑动流畅,通常会使用ImageView的Drawable的mutate()方法创建图片的副本,这样在旋转时不会影响到其他图片的显示。 在实际应用中,SlidingImageGallery的图片旋转功能可以适应各种场景,比如...

    android圆角ImageView

    首先,你需要创建一个Bitmap对象,然后创建一个Shader对象,设置其类型为`BitmapShader`,最后将Shader应用到Paint对象上。这种方法适用于动态加载的图片,但代码相对复杂。 以上就是实现Android圆角ImageView的几...

    android开发皮肤图片

    可以使用Drawable对象的mutate()方法来复制一份图片资源,避免对原资源的修改影响其他视图。 7. **兼容性测试**:在不同设备和Android版本上进行测试,确保皮肤图片在各种环境下都能正确显示。 总之,Android开发...

    Android 改变图标原有颜色和搜索框的实例代码

    在这个函数中,`drawable.mutate()`是为了确保Drawable对象不会被其他地方的引用所影响,`setColorFilter()`则是设置颜色过滤器,`PorterDuff.Mode.SRC_IN`是混合模式,表示目标颜色会替换源颜色。这样,我们就可以...

    Android实现图片阴影效果的方法

    当我们需要对同一张图片进行不同的处理时(如添加不同阴影),必须先调用`mutate()`方法,使Drawable对象变为可变的,否则修改会影响到其他使用同一资源的对象。 6. **`BitmapFactory.decodeResource()`**: 这个...

    KungFuPanda.zip

    3. **启动动画**:在Activity的onCreate()方法中,通过ImageView的getDrawable().mutate()方法将背景转换为可变的AnimationDrawable对象,然后调用start()方法启动动画。 4. **控制动画播放**:还可以通过 ...

    BTN水印效果

    通过`Drawable`的`mutate()`和`setTint()`方法,可以改变Ripple的颜色,`setAlpha()`可以调整透明度,`setRadius()`则可以设定涟漪的扩散半径。 6. **RippleView库** 提到的"RippleView-master"可能是一个开源项目...

    Android图片处理工具类,包括: 图片查看、照片墙、bitmap转存、圆角、剪切、图片加载缓存、图片压缩等

    - 使用`Drawable`的`mutate()`方法防止多个View之间图片状态同步导致的性能问题。 - 对于大图,考虑使用`WebP`或`SVG`格式,它们具有更小的体积和更好的压缩效果。 以上知识点覆盖了Android图片处理的各个方面,...

    安卓Android源码——RoundedImageView-master.zip

    这个开源项目不仅为开发者提供了一种方便的解决方案,还为深入理解 Android 图形绘制和自定义视图的开发提供了实例。通过研究这个源码,开发者可以提升自己的 Android 技能,同时也能更好地优化应用的用户体验。

Global site tag (gtag.js) - Google Analytics