请帮助我理解为什么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;
}
});
}
}
答案 0 :(得分:0)
为了从View中获取位图,生成缓存的顺序如下:
mImageButton.setDrawingCacheEnabled(true);
mImageButton.buildDrawingCache();
mBitmapDrawingCache = Bitmap.createBitmap(mImageButton.getDrawingCache());
您需要在OnTouchListener
内或更优选OnClickListener
内一起调用此内容(如果您只想在点击时生成位图)。
但是,我不确定您为什么要调用所有MeasureSpec的东西...如果您通过setContentView(R.layout.activity_main);
加载图像,那么不要为所有手动测量而烦恼。