将TextView转换为Bitmap再转换为ImageView,但什么也没有显示出来

4
我开始了一个测试项目,只是为了把这个问题解决。没有对main.xml进行任何更改。我想创建一个小部件大小的ImageView(80x100),其中包含从TextView转换而来的位图。是的,这听起来非常迂回,但这只是为了测试;最终我希望ImageView具有背景图像和多个TextView。我不确定我做错了什么,但是没有任何东西被推送到屏幕上。
声明TextView/ImageView并在构造函数中传递“this”是否有问题?我的layoutParams有问题吗?以下是代码:
package com.doaf.testproject;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class TestProject extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TextView tv = new TextView(this);
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(80, 100);
        tv.setLayoutParams(layoutParams);
        tv.setText("testing 1 2 3");
        tv.setTextColor(0xFFFFFF);
        tv.setBackgroundColor(0x555555);

        Bitmap testB;
        testB = loadBitmapFromView(tv);

        ImageView iv = new ImageView(this);
        iv.setLayoutParams(layoutParams);
        iv.setBackgroundColor(0x555555);
        iv.setImageBitmap(testB);

        setContentView(iv);
    }

    public static Bitmap loadBitmapFromView(View v) {
        Bitmap b = Bitmap.createBitmap(80, 100, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(b);
        v.layout(0, 0, 80, 100);
        v.draw(c);
        return b;
    }
}

非常感谢你能提供的任何帮助。我对Android相对较新,对这个问题感到很困惑。


这听起来像是一个非常糟糕的想法。 - Falmarri
@Rockmaninoff:你在使用自定义布局吗? - Sankar Ganesh PMP
@Tilsan The Fighter:我计划使用自定义布局。最终目的是生成一个由可选背景图像和几个TextView组成的LinearLayout,然后将该LinearLayout导出为Bitmap,再将其作为小部件(ImageView?)的背景。 - Rockmaninoff
@Falmarri:你为什么这么说? - Rockmaninoff
3个回答

8

我认为它占据整个屏幕是因为您没有容器,例如线性布局,该布局包含具有布局约束的ImageView,因此ImageView会扩展以填充可用屏幕。请尝试这样做:

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

        TextView tv = new TextView(this);
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(80, 100);
        tv.setLayoutParams(layoutParams);
        tv.setText("testing 1 2 3");
        tv.setTextColor(Color.BLACK);
        tv.setBackgroundColor(Color.TRANSPARENT);

        Bitmap testB;

        testB = Bitmap.createBitmap(80, 100, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(testB);
        tv.layout(0, 0, 80, 100);
        tv.draw(c);

        ImageView iv = (ImageView)findViewById(R.id.menuIcon);
        iv.setLayoutParams(layoutParams);
        iv.setBackgroundColor(Color.GRAY);
        iv.setImageBitmap(testB);
        iv.setMaxHeight(80);
        iv.setMaxWidth(80);
    }

在你的main.xml文件中:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <ImageView android:id="@+id/menuIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />


</LinearLayout>

我不确定你想要达到什么目的,但我相信有更有效的方法来处理它。

1

快速修改代码,尝试这样做以查看是否达到您想要的效果:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    TextView tv = new TextView(this);
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(80, 100);
    tv.setLayoutParams(layoutParams);
    tv.setText("testing 1 2 3");
    tv.setTextColor(Color.BLACK);
    tv.setBackgroundColor(Color.TRANSPARENT);

    Bitmap testB;

    testB = Bitmap.createBitmap(80, 100, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(testB);
    tv.layout(0, 0, 80, 100);
    tv.draw(c);

    ImageView iv = new ImageView(this);
    iv.setLayoutParams(layoutParams);
    iv.setBackgroundColor(Color.GRAY);
    iv.setImageBitmap(testB);

    setContentView(iv);
}

1
嗨,Mike,这绝对是迈向正确方向的一步。背景和文本已经渲染出来了,但它们填满了整个屏幕。能否解释一下为什么这段代码有效而我的不行(我想在这里学习),以及为什么它可能会填充整个屏幕?我有预感这与layoutParams有关...或者也许需要将iv放置在Layout中以防止其填充整个屏幕。谢谢! - Rockmaninoff

1
在绘制 TextView 之前,您需要对其进行测量(调用 measure())和布局(调用 layout())。但是目前你都没有做到。

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