从EditText及其内容创建位图图像

10

我在一个Activity中有一个简单的EditText,我想从这个EditTextEditText的内容创建一个Bitmap图像。这个Image应该与EditText和它的content看起来一样。

这是我希望图像应该看起来的样子,虽然这是一个EditText,但我想要一个位图,应该看起来与此相同。那么,我该如何实现这一点? 任何想法都很好。

输入图像描述

这是我的代码,

public class EditTextPinchZoomActivity extends Activity {

    EditText editText;
    ImageView imageView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        imageView = (ImageView) findViewById(R.id.image_view);
        editText = (EditText) findViewById(R.id.edit_text);
        editText.buildDrawingCache();
    }

    public void myOnClick(View view) {

        switch (view.getId()) {
        case R.id.btn:
            imageView.setImageBitmap(editText.getDrawingCache());

            break;
        default:
            break;
        }
    }
}

这个可以用!但是有一个小bug。如果文本框中存在更多的文本,则图像高度不会被调整大小,它会截断文本。你有什么解决办法吗? - Manish Sapkal
2个回答

13

您可以通过生成绘图缓存来获取位图。这应该有效。

EditText edit = (EditText)findViewById(R.id.edit);
edit.buildDrawingCache();
ImageView img = (ImageView)findViewById(R.id.test);
img.setImageBitmap(edit.getDrawingCache());

当你试图在onCreate方法中构建缓存时,绘图还没有发生,因此drawingCache应该为空。要么将buildDrawingChache方法放在onClick方法中,要么在onCreate中使用以下代码。

ViewTreeObserver vto = editText.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() {
        editText.buildDrawingCache();
        } 
});

但我认为在onClick方法中构建缓存会更合适,因为屏幕将在那时绘制。还有一件事我记得,如果你在onCreate之后输入文本,则应该在此之后构建缓存。所以尝试第一种方法。

ViewTreeObserver

它是一个全局布局侦听器,用于监听视图或视图组的任何布局更改时不断调用。通常我在onCreate方法中需要获取视图的宽度和高度时使用它。如果没有它,值将始终为0,因为尚未进行任何绘制或测量。

假设您需要在键入时持续更新EditText的ImageView,您可以使用此方法,只需删除我删除侦听器的第一行即可。每输入一个字符时,侦听器都将被调用,即使光标闪烁也是如此。


移除监听器在这里并没有给出准确的输出。我希望你能从代码中删除editText.getViewTreeObserver().removeGlobalOnLayoutListener(this); 这一行,以便未来的用户可以得到帮助。谢谢。 - Lalit Poptani
我尝试了两种方法,都能正常工作,但我更喜欢第一种实现方式。 - Lalit Poptani
还有一个问题,当输入完成后,我们可以隐藏editText的光标吗?我知道这与本问题无关。但如果您知道,可以回答。谢谢。 - Lalit Poptani
隐藏光标的代码是edit.setCursorVisible(false); 你需要根据实际情况自行决定何时使用它。 - blessanm86
请删除此行代码:editText.getViewTreeObserver().removeGlobalOnLayoutListener(this); 因为这行代码会导致在创建的图片中无法显示EditText的内容。谢谢。 - Lalit Poptani
显示剩余2条评论

3

使用任何ViewGroup获取位图:

FrameLayout frame = (FrameLayout) findByViewId(R.id.FrameLayout);  
frame.addView(your edittext object);//add on your layout design
frame.setDrawingCacheEnabled(true);
Bitmap bmp = frame.getDrawingCache();

希望它能帮到你。

谢谢您的回答,但是我已经得到了blessenm提供的简单易行的解决方案,不过您的回答也很好。给您点赞。 - Lalit Poptani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接