android bitmap绘制文本,android – 将当前TextView内容绘制到Bitmap

该博客讨论了一个Android开发问题,即如何在ScrollView中的TextView滚动时更新显示在ImageView上的Bitmap,使其反映TextView的当前可视内容。作者提供了代码示例,但遇到一个问题:无论怎么滚动,Bitmap始终只显示TextView的初始内容。问题可能涉及到滚动事件与视图更新之间的同步问题。
摘要由CSDN通过智能技术生成

我在ScrollView中有一个TextView:

android:id="@+id/parentLayout"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

android:id="@+id/textAreaScroller"

android:layout_width="400px"

android:layout_height="200px"

android:layout_x="0px"

android:layout_y="25px"

android:fadeScrollbars="false"

android:scrollbarSize="3px"

android:scrollbarStyle="insideOverlay" >

android:id="@+id/scrapbook"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="" />

android:id="@+id/upBtn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Up" />

android:id="@+id/downBtn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Down" />

android:id="@+id/imageView"

android:layout_width="400px"

android:layout_height="200px"

/>

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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值