getDrawingCache()在布局后返回null

时间:2016-08-08 08:05:45

标签: android

请帮助我理解为什么getDrawingCache()在附加到我的图片按钮视图的ontouchlistner中的图像按钮视图(appcompatimagebutton)上调用时返回null。

主要是,在试图解决这个问题时,我一直在提到这个问题:

Android View.getDrawingCache returns null, only null

这还没有解决我的问题。我确信我忽略了某些东西或者没有完全理解某些东西。请帮我弄清楚它是什么。

注意:

1)它似乎没有天气我使用ImageButton或AppCompatImageButton(但我使用appcompat,因为在实际项目中我需要它提供的ImageButton没有的功能)。

2)我不明白为什么我需要调用视图的度量和布局方法,因为在用户触发ontouch()时布局已经被绘制到屏幕上但是我认为d无论如何包括它,因为我找到的许多答案似乎表明这是必需的..如果我把它们取出它也不起作用。

3)如果我将onEouch或onCreate中的setEnableDrawingCache和buildDrawingCache调用与AppCompatImageButton视图初始化放在一起似乎无关紧要。在任何一种情况下,我的ontouchlistener调用图像按钮视图的getDrawingCache都返回null。

这是代码示例,

谢谢!

public class MainActivity extends AppCompatActivity {
    AppCompatImageButton mImageButton;
    Bitmap mBitmapDrawingCache;

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

        //create image button
        mImageButton = new AppCompatImageButton(this);
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(270, 270);
        mImageButton.setLayoutParams(layoutParams);

        //getDrawingCache() in ontouchlistener returns null regardless if this is set
        int mseWidth = View.MeasureSpec.makeMeasureSpec(270, View.MeasureSpec.EXACTLY);
        int mseHeight = View.MeasureSpec.makeMeasureSpec(270, View.MeasureSpec.EXACTLY);
        mImageButton.measure(mseWidth, mseHeight);
        mImageButton.layout(0, 0, 270, 270);
        /* this does not work either
        int mseWidth = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        int mseHeight = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        mImageButton.measure(mseWidth, mseHeight);
        mImageButton.layout(0, 0, mImageButton.getMeasuredWidth(), mImageButton.getMeasuredHeight());
        */

        //getDrawingCache() in ontouchlistner returns null regardless if either, both or none of these are set
        //mImageButton.buildDrawingCache();
        mImageButton.setDrawingCacheEnabled(true);

        //attach image button view to content view
        ((FrameLayout) findViewById(android.R.id.content)).addView(mImageButton);

        //set touch listener
        mImageButton.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                //why is this line returning null instead of a Bitmap ?
                mBitmapDrawingCache = Bitmap.createBitmap(v.getDrawingCache());

                Log.d("TAG_A", mBitmapDrawingCache.toString());

                return false;
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

为了从View中获取位图,生成缓存的顺序如下:

mImageButton.setDrawingCacheEnabled(true);
mImageButton.buildDrawingCache();
mBitmapDrawingCache = Bitmap.createBitmap(mImageButton.getDrawingCache());

您需要在OnTouchListener内或更优选OnClickListener内一起调用此内容(如果您只想在点击时生成位图)。

但是,我不确定您为什么要调用所有MeasureSpec的东西...如果您通过setContentView(R.layout.activity_main);加载图像,那么不要为所有手动测量而烦恼。