9

我目前正在处理一个需要显示带有灰色(黑色/白色)背景的对话框的项目。为了实现这一点,我正在截取整个应用程序的屏幕截图,将此屏幕截图放在全屏对话框的背景上,并在其上放置一个 ColorFilter 以使其变灰。

这第一次很完美,但是如果我滚动底层内容并再次请求对话框,它会显示与之前相同的背景。

我使用代码:

Bitmap bitmap;
View rootView = getActivity().getWindow().getDecorView().findViewById(android.R.id.content);
rootView.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(rootView.getDrawingCache());
rootView.setDrawingCacheEnabled(false);
imageView.setImageBitmap(bitmap);

换句话说,getDrawingCache() 总是返回应用程序的相同屏幕截图。

4

2 回答 2

25

我认为那是因为您的旧位图仍在您的绘图缓存中。因此,您首先需要将其从缓存中删除,然后将新图像放入缓存中。看看这个问题,它似乎是同一个话题:

删除绘图缓存

编辑: 所以,这是对我有用的代码。我使用按钮保存位图,然后将位图设置为图像视图:

private View rootView;
private ImageView bitmapView;
private Button switchButton;
public Bitmap capturedScreen;
public boolean bitmapNeeded = false;

...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // do the other stuff
    rootView.setDrawingCacheEnabled(true); //enable Drawing cache on your view
    switchButton.setOnClickListener(this);
}

...

@Override
public void onClick(View v) {
    if (v == switchButton) { //when the button is clicked
        captureScreen();
    }
}

public void captureScreen() {
    rootView.buildDrawingCache();       
    capturedScreen = Bitmap.createBitmap(rootView.getDrawingCache());
    imageView.setImageBitmap(capturedScreen);
    rootView.destroyDrawingCache();
}

.... 

//In the onDraw method of your View:
@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(capturedScreen, 0, 0, paint);
}

它是这样工作的:每次用户单击按钮时,里面的所有内容rootView都会保存为位图,然后绘制到imageView. 如果需要,您当然可以从代码中的任何位置调用 captureScreen 方法。

我希望这个例子对你有所帮助。

于 2014-03-24T13:28:46.753 回答
0
    RelativeLayout rlThemeOne=findviewbyId(R.id.rlThemeOne);
    rlThemeOne.destroyDrawingCache();   //destroy preview Created cache if any
    rlThemeOne.buildDrawingCache();    //build new cache
    Bitmap bitmap = rlThemeOne.getDrawingCache();  //get the cache in bitmap
于 2021-04-22T14:31:00.917 回答