为什么setImageBitmap对自定义ImageButton没有影响?

时间:2016-04-25 23:51:59

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

我找到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 I中创建Pen(自定义ImageButton)实例,定义setGlow()并从setImageBitmap()的实例调用Pen

// 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),但这次我调用了        fromTouchEvent()里面的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);
    }
    // ....
} 

3 个答案:

答案 0 :(得分: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) {
       ....
    }
}

如果这是问题,请检查此link

答案 1 :(得分:5)

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

onTouchEvent将每秒触发serval次数。您将在内存中每秒创建serval位图。在成功设置ImageBitmap之前,内存将会不足。

答案 2 :(得分:3)

我在发布时构建了项目,但它运行正常。它正确设置了位图。所以也许getGlow()方法不能很好地工作。制作一些日志如下

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

然后检查返回是否正确。