getDrawingCache всегда возвращает одно и то же растровое изображение

В настоящее время я работаю над проектом, который должен отображать диалог с серым (черным / белым) фоном. Чтобы добиться этого, я делаю снимок экрана со всем приложением, поместите этот снимок экрана на фоне полноэкранного диалогового окна и поместите на него 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() всегда возвращает один и тот же снимок экрана приложения.

2 ответа

Решение

Я думаю, это потому, что ваше старое растровое изображение все еще находится в вашем кэше чертежей Из-за этого вам сначала нужно удалить его из кеша, а затем поместить новый образ в кеш. Взгляните на этот вопрос, который, кажется, относится к той же теме:

Удаление кеша рисования

РЕДАКТИРОВАТЬ: Итак, вот код, который работает для меня. Я использую кнопку, чтобы сохранить растровое изображение, а затем установить растровое изображение в виде изображения:

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 из любого места в вашем коде, если это необходимо.

Я надеюсь, что этот пример поможет вам.

          rlThemeOne.destroyDrawingCache();   //destroy preview Created cache if any
    rlThemeOne.buildDrawingCache();    //build new cache
    Bitmap bitmap = rlThemeOne.getDrawingCache();  //get the cache
Другие вопросы по тегам