如何在将视图另存为图像之前强制立即重绘

时间:2014-08-23 08:53:48

标签: android view redraw

我有一个自定义TextView,我将其视为EditText视图。用户按下“共享”按钮,包含TextView的布局将保存为PNG图像并共享给社交网络。

我的问题是TextView中有一个游标字符。在创建图像之前,我想删除光标字符。但是,如果我使用我创建和共享图像的相同方法删除角色,则应用程序崩溃,因为它没有机会重新绘制视图。

我的问题与How to force a view to redraw immediately before the next line of code is executed基本相同,但与此问题不同,我不需要更改背景资源。

我尝试调用invalidate(),但这并没有解决问题,因为在我需要视图之前,UI永远不会有机会重绘。

我该怎么办?

这是我的代码:

public void shareToOtherApps(View v) {

    RelativeLayout messageOutline = (RelativeLayout) findViewById(R.id.rlMessageOutline);

    // Remove cursor from display (inputWindow is a TextView)
    inputWindow.setText(converter
            .unicodeToFontReadable(unicodeText.toString()));
    inputWindow.invalidate(); // This line makes no difference

    // Code to save image
    messageOutline.setDrawingCacheEnabled(true);
    Bitmap bitmap = messageOutline.getDrawingCache(true);
    ...

    // Code to share image
    ...

    // Add cursor back to display
    updateDisplay();
}

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,但是将代码保存/共享runnable内的图像并在删除光标字符后运行它。这会将runnable代码放在消息堆栈的末尾,并允许UI在尝试保存视图图像之前更新其视图。

以下是代码摘要:

public void shareToOtherApps(View v) {

    // Remove cursor from display (inputWindow is a TextView)
    inputWindow.setText(converter.unicodeToFontReadable(unicodeText.toString()));

    // Put this in a runnable to allow UI to update itself first
    inputWindow.post(new Runnable() {
        @Override
        public void run() {

            // Code to save image
            RelativeLayout messageOutline = (RelativeLayout) findViewById(R.id.rlMessageOutline);
            messageOutline.setDrawingCacheEnabled(true);
            Bitmap bitmap = messageOutline.getDrawingCache(true);

            // Code to share image
            ...

            // Add cursor back to display
            updateDisplay();
        }
    });

}