【问题标题】:Why does setImageBitmap has no effect on custom ImageButton?为什么 setImageBitmap 对自定义 ImageButton 没有影响?
【发布时间】:2016-08-19 13:59:47
【问题描述】:

我找到了this 链接,该链接说明了如何在我的ImageButton 上制作发光效果。因此,每当用户按下ImageButton 时,就会调用onTouchEvent() 函数,然后我会调用setImageBitmap() 函数。问题是这个函数(setImageBitmap())似乎根本没有效果。

什么有效:

1) 到目前为止,我将ImageButton 扩展如下

// Pen.java
public class Pen extends ImageButton {
    public Pen(Context context, AttributeSet attrs) {
        super(context, attrs);  
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.out.println("Now I am setting  Pen");
        return true;
    }


}

然后在 Activity 中创建Pen(自定义ImageButton)实例,定义setGlow() 并从Pen 实例调用setImageBitmap()

//MainActivity.java

public class MainActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Pen myImgbutton; 
        myImgbutton = (Pen) findViewById(R.id.pen);

        myImgbutton.setImageBitmap(setGlow(R.drawable.pen));

    }
}

public Bitmap setGlow(int resourceId) {
      ......
}

什么不起作用:

1) 与上述相同(在 android 中扩展 ImageButton),但这次我调用的是 来自 onTouchEvent() 内部的 setImageBitmap 函数。对于这种情况,我在 Pen.java 中定义了 setGlow 函数

// Pen.java
public class Pen extends ImageButton {
    public Pen(Context context, AttributeSet attrs) {
        super(context, attrs);  
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.out.println("Now I am setting  Pen");
        // Here I say to apply the glow effect to the image
        setImageBitmap(setGlow(R.drawable.pen)); 
        return true;
    }

    public Bitmap setGlow(int resourceId) {
       ....
    }
}

然后在xml文件中我做:

  .....

   <com.example.testsetimagebmp.Pen
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/pen"
        android:background="@drawable/pen" />

   ....

终于进入 MainActivity

public class MainActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    // ....
} 

【问题讨论】:

  • onTouchEvent 被调用了吗?
  • 您的意思是,如果您在MainActivity 中调用setImageBitmap,它会起作用。但是它在onTouchEvent 中不起作用?
  • @shhp 是的,如果从 onTouchEvent 调用它不起作用
  • 您可以尝试在致电setImageBitmap() 后添加invalidate()
  • 当您尝试使用 imageView 而不是 Imagebutton 时?它仍然发生?

标签: android bitmap android-drawable android-bitmap bitmapimage


【解决方案1】:

我认为这可能是典型的内存不足问题。如果您想检查是否属实,可以尝试使用启动器图标的位图:

public class Pen extends ImageButton {
    public Pen(Context context, AttributeSet attrs) {
        super(context, attrs);  
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        System.out.println("Now I am setting  Pen");
        // Here I say to apply the glow effect to the image
        setImageBitmap(setGlow(R.mipmap.ic_launcher)); 
        return true;
    }

    public Bitmap setGlow(int resourceId) {
       ....
    }
}

如果这是问题,请查看link

【讨论】:

  • 我不确定这是否是内存不足的问题,因为我确实做了 catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }
【解决方案2】:

你不能这样做,因为如果你把 setImageBitmap(setGlow(R.drawable.pen)) 放在 onTouchEvent 中,你会内存不足。

onTouchEvent 每秒会触发 serval 次。并且您将每秒在内存中创建 serval 位图。在成功设置 ImageBitmap 之前它会耗尽内存。

【讨论】:

  • 为了避免这种情况发生,我尝试创建一个静态布尔变量并将其初始化为 true,并在调用 setImageBitmap() 后将变量更改为 false
【解决方案3】:

我按照您发布的内容构建了该项目,但它运行良好。它正确设置位图。所以也许 getGlow() 方法不能很好地工作。如下制作一些日志

public Bitmap setGlow(int resourceId) {
    Bitmap bm = BitmapFactory.decodeResource(getResources(),resourceId);
    Log.e("tag", "Size: " + bm.getByteCount());
    return bm;
}

然后检查返回是否正确。

【讨论】:

  • 是的,它也对我有用..自动..但问题仍然存在于我的原始项目中......问题是我的项目的愚蠢版本
  • 在原始项目中,我有包含 [ viewgroup1 和 canvas ] 的视图组。 viewgroup1 包含当用户触摸按钮时想要发光的 buttonImage(笔)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
相关资源
最近更新 更多