如何在Android中完全加载ImageView时获取

Fel*_*sso 13 android bitmap imageview android-canvas

我正在开发一个应用程序,它在一堆图像上绘制线条.为了选择这些图像,我有一个广播组,每当用户点击一个单选按钮时,图像就会加载所有图纸.

在我的收音机听众中,我有以下代码:

bitmap = BitmapUtils.decodeSampledBitmapFromResource(root + DefinesAndroid.CAMINHO_SHOPPINGS_SDCARD + nomeImagemAtual, size.x, size.y);
mImage.setImageBitmap(bitmap);

mImage.setDrawLines(true);
mImage.setImageBitmap(loadBitmapFromView(mImage));
Run Code Online (Sandbox Code Playgroud)

decodeSampledBitmapFromResource我从Android开发人员的这个链接获得的方法(它更有效地加载位图)http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

这是我调用以获取视图位图的方法

    public static Bitmap loadBitmapFromView(View v) {
        Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);                
        Canvas c = new Canvas(b);
        v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
        v.draw(c);
        return b;
}
Run Code Online (Sandbox Code Playgroud)

我正在设置图像Bitmap,mImage因为我正在使用ImageViewTouch库(它可以在ImageView上进行缩放缩放),如果我不这样做,所有画布绘图都会被删除,图像上的任何交互都会被删除(比如放大/出).

错误日志如下

07-11 21:13:41.567: E/AndroidRuntime(20056): java.lang.IllegalArgumentException: width and height must be > 0
07-11 21:13:41.567: E/AndroidRuntime(20056):    at android.graphics.Bitmap.createBitmap(Bitmap.java:638)
07-11 21:13:41.567: E/AndroidRuntime(20056):    at android.graphics.Bitmap.createBitmap(Bitmap.java:620)
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定这个错误正在发生,因为当我调用getBitmapFromView方法时图像位图没有完全加载.

如何知道视图何时完全加载?

Dmi*_*sev 25

loadBitmapFromView以这种方式打电话:

mImage.post(new Runnable() {
    @Override
    public void run() {
        loadBitmapFromView(mImage);
    }
});
Run Code Online (Sandbox Code Playgroud)

Runnable提供给post()方法将视图测量和布点之后被执行,所以getWidth()getHeight()将返回的实际宽度和高度.

你还能做什么,View手动测量,调用measure,然后从getMeasuredWidth()和得到结果getMeasuredHeight().但我不推荐这种方式.

  • @RiddlerDev 使用“OnPreDrawListener”检查另一个解决方案(由我发布)。 (2认同)

Dmi*_*sev 12

通过使用实际上有另一种更可靠的方法ViewTreeObserver.OnPreDrawListener.这是一个例子:

mImage.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){

    @Override
    public boolean onPreDraw() {
        try {
            loadBitmapFromView(mImage);            
            return true;    //note, that "true" is important, since you don't want drawing pass to be canceled
        } finally {
            mImage.getViewTreeObserver().removeOnPreDrawListener(this);    //we don't need any further notifications
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

使用OnPreDrawListener 保证View测量和layouted,而View#post(Runnable)只是执行你Runnable在所有浏览已经最有可能测量和layouted.