Android getDrawingCache()不包含TextView / TextClock的实际值

时间:2017-05-19 07:21:23

标签: android bitmap drawingcache

我想获得两个屏幕位图。问题是,TextViewTextClock包含来自getDrawingCache()的第一次调用的值。第二次调用TextView后,TextClockBitmap的值不会在新的getDrawingCache()中刷新。

使用Nexus 5(第二个位图包含来自TextClock的正确时间) 在许多其他设备上不起作用。例如:华为荣誉4C。

minSdkVersion 21
targetSdkVersion 25
compileSdkVersion 25

TextClock会自动更改值。即使我在setText()上调用TextView方法,也无法正常工作 哪里有问题?

测试:
使用以下代码创建简单布局:TextClock并在UI线程中运行此代码:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        Log.i("TAG", Thread.currentThread().getName());
        try {
            Bitmap bitmapScreen = getBitmapOfScreen();
            //File f = new File("/storage/sdcard1", "tmp.jpg");   //Huawei
            File f = new File("/storage/emulated/0", "tmp.jpg");  //Nexus 5
            FileOutputStream fis = new FileOutputStream(f);
            bitmapScreen.compress(Bitmap.CompressFormat.JPEG, 100, fis);
            fis.flush();
            fis.close();
            bitmapScreen.recycle();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}, 5000);

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        Log.i("TAG", Thread.currentThread().getName());
        try {
            Bitmap bitmapScreen = getBitmapOfScreen();
            //File f = new File("/storage/sdcard1", "tmp2.jpg");    //Huawei
            File f = new File("/storage/emulated/0", "tmp2.jpg");  //Nexus 5
            FileOutputStream fis = new FileOutputStream(f);
            bitmapScreen.compress(Bitmap.CompressFormat.JPEG, 100, fis);
            fis.flush();
            fis.close();
            bitmapScreen.recycle();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}, 10000);

/** Must be called in UI thread.*/
public Bitmap getBitmapOfScreen() throws Exception {

    final View v1 = getWindow().getDecorView().getRootView();
    v1.destroyDrawingCache();
    v1.setDrawingCacheEnabled(true);

    v1.buildDrawingCache();
    Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
    bitmap.setHasAlpha(true);           //important for PNG
    v1.setDrawingCacheEnabled(false);
    return bitmap;
}

1 个答案:

答案 0 :(得分:0)

<强>解决。

在视图中缺少被叫invalidate()。目前,当我在invalidate()调用之前在TextClock上致电getBitmapOfScreen()时,位图中的值是正确的。