为什么在自定义ImageButton上调用setImageBitmap没有效果?

8
我发现了这个链接,它指出了如何使我的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 被调用了吗? - shhp
你的意思是如果在MainActivity中调用setImageBitmap,它可以正常工作。但是在onTouchEvent中却无法正常工作? - shhp
如果从onTouchEvent调用它,则@shhp无效。 - pokche
你可以尝试在调用setImageBitmap()后添加invalidate() - idunnololz
你尝试使用imageView而不是Imagebutton了吗?问题还存在吗? - Francisco Durdin Garcia
@FranciscoDurdinGarcia 是的 - pokche
3个回答

5

如果您在onTouchEvent中使用setImageBitmap(setGlow(R.drawable.pen)),会导致内存不足。

因为onTouchEvent每秒钟会触发多次,您每秒钟都会在内存中创建几个位图。在成功设置setImageBitmap之前,内存就会耗尽。


为了避免这种情况发生,我尝试创建一个静态布尔变量,并将其初始化为true,在调用setImageBitmap()后将变量更改为false。 - pokche

5

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

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) {
       ....
    }
}

如果这是问题,请查看此链接,其中有相关的解决方案。

我不确定这是否是内存问题,因为在catch中我做了如下处理:catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } - pokche

3

我按照你发布的内容构建了这个项目,但它可以正常运行。它正确地设置了Bitmap,所以可能是getGlow()方法不太好用。请按照以下方式生成一些日志信息。

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

然后检查返回是否正确。

是的,这对我也起作用了..自动地..但我的原始项目仍然存在问题...问题是对我的项目进行了简化。 - pokche
在原始项目中,我有一个包含[viewgroup1和画布]的viewgroup。 viewgroup1包含buttonImage(笔),当用户触摸按钮时希望其发光。 - pokche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接