android – 将当前TextView内容绘制到Bitmap

前端之家收集整理的这篇文章主要介绍了android – 将当前TextView内容绘制到Bitmap前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我在ScrollView中有一个TextView:

TextView有很多文本,这就是可滚动的原因.我需要在TextView中将当前可见内容绘制到Bitmap.出于测试目的,我在ImageView中显示此位图.我有以下代码

public class TextviewToImageActivity extends Activity {

    private TextView textView;
    private ScrollView textAreaScroller;
    private ImageView imageView;

    private Handler mHandler;

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

        mHandler = new Handler();

        imageView = (ImageView) findViewById(R.id.imageView);
        textAreaScroller = (ScrollView) findViewById(R.id.textAreaScroller);
        textView = (TextView) findViewById(R.id.scrapbook);

        textView.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v,MotionEvent event) {
                imageView.setImageBitmap(loadBitmapFromView(textAreaScroller));
                return false;
            }
        });

        Button upBtn = (Button) findViewById(R.id.upBtn);
        Button downBtn = (Button) findViewById(R.id.downBtn);

        upBtn.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v,MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    scheduleScroller(upScroller);
                    imageView.setImageBitmap(loadBitmapFromView(textView));
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    mHandler.removeMessages(1);
                }
                return true;
            }
        });

        downBtn.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v,MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    scheduleScroller(downScroller);
                    imageView.setImageBitmap(loadBitmapFromView(textView));
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    mHandler.removeMessages(1);
                }
                return true;
            }
        });

        loadDoc();
    }

    private Runnable downScroller = new Runnable() {
        public void run() {
            textAreaScroller.scrollBy(0,10);
            scheduleScroller(downScroller);
        }
    };

    private Runnable upScroller = new Runnable() {
        public void run() {
            textAreaScroller.scrollBy(0,-10);
            scheduleScroller(upScroller);
        }
    };

    private void scheduleScroller(Runnable scrollerJob) {
        Message msg = Message.obtain(mHandler,scrollerJob);
        msg.what = 1;
        mHandler.sendMessageDelayed(msg,10);
    }

    private static Bitmap loadBitmapFromView(View v) {
        Bitmap b = Bitmap.createBitmap(400,200,Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(b);
        v.draw(c);
        return b;

    }

    private void loadDoc() {
        String s = "";

        for (int x = 0; x <= 100; x++) {
            s += "Line: " + String.valueOf(x) + "\n";
        }

        textView.setText(s);
        textView.setMovementMethod(new ScrollingMovementMethod());
    }
}

问题是,一旦我滚动TextView(触发TouchEvent),Bitmap不会反映TextView的当前内容,而是始终只有TextView的开头内容(当前滚动位置无关紧要).我更新了帖子以提供工作代码 – 也许它可以在sb的其他设备上运行.

UPDATE

我还尝试通过在我的自定义TextView中覆盖onDraw来检查WarrenFaith的想法,但它仍然只是绘制TextView的开头内容

public class MyTextView extends TextView {

    private Bitmap mBitmap;

    public MyTextView(Context context,AttributeSet attrs) {
        super(context,attrs);

    }
    public MyTextView(Context context) {
        super(context);
    }

    public MyTextView(Context context,AttributeSet attrs,int defStyle) {
        super(context,attrs,defStyle);
    }

    public Bitmap getBitmap() {
        return mBitmap;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        mBitmap = Bitmap.createBitmap(canvas.getWidth(),canvas.getHeight(),Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(mBitmap);
        super.onDraw(canvas);
        super.onDraw(c);

    }
}
最佳答案
尝试覆盖TextView的onDraw()方法应该工作.在那里,您可以基于canvas参数创建位图.详细信息可以在我的教程中找到:How to create and save a screenshot from a SurfaceView

更新:
解决了你的问题:

活动(我更改了Handler用法删除了一些方法.基本上我稍微缩小了代码).

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.text.method.ScrollingMovementMethod;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageView;

/**
 * @author WarrenFaith
 */
public class TextToImageActivity extends Activity {

    private MyTextView textView;
    private ImageView imageView;

    private boolean mRepeatDrawing = false;

    private Handler mHandler;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.textview);

        mHandler = new Handler();

        imageView = (ImageView) findViewById(R.id.imageView);
        textView = (MyTextView) findViewById(R.id.scrapbook);

        Button upBtn = (Button) findViewById(R.id.upBtn);
        Button downBtn = (Button) findViewById(R.id.downBtn);

        upBtn.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v,MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    mRepeatDrawing = true;
                    mHandler.post(upScroller);
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    mRepeatDrawing = false;
                }
                return false;
            }
        });

        downBtn.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v,MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    mRepeatDrawing = true;
                    mHandler.post(downScroller);
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    mRepeatDrawing = false;
                }
                return false;
            }
        });

        loadDoc();
    }

    private Runnable downScroller = new Runnable() {
        public void run() {
            textView.scrollBy(0,10);
            imageView.setImageBitmap(textView.getBitmap());
            if (mRepeatDrawing) {
                mHandler.postDelayed(this,10);
            }
        }
    };

    private Runnable upScroller = new Runnable() {
        public void run() {
            textView.scrollBy(0,-10);
            imageView.setImageBitmap(textView.getBitmap());
            if (mRepeatDrawing) {
                mHandler.postDelayed(this,10);
            }
        }
    };

    private void loadDoc() {
        String s = "";

        for (int x = 0; x <= 100; x++) {
            s += "Line: " + String.valueOf(x) + "\n";
        }

        textView.setText(s);
        textView.setMovementMethod(new ScrollingMovementMethod());
    }
}

自定义textview:重要:诀窍是获得滚动位置!

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * @author WarrenFaith
 */
public class MyTextView extends TextView {

    private Bitmap mBitmap;

    public MyTextView(Context context,attrs);

    }

    public MyTextView(Context context) {
        super(context);
    }

    public MyTextView(Context context,defStyle);
    }

    public Bitmap getBitmap() {
        return mBitmap;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        mBitmap = Bitmap.createBitmap(getWidth(),getHeight(),Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(mBitmap);
        c.translate(0,-getScrollY());
        super.onDraw(c);
        super.onDraw(canvas);
    }
}

xml :(我删除了ScrollView并让TextView处理滚动)

猜你在找的Android相关文章