从布局中获取位图

10

我试图膨胀(inflate)一个布局并使用它来设置一个ImageView上的位图,然后将该ImageView添加到LinearLayout中并显示该LinearLayout。这是我尝试过的代码:

public class TestActivity extends Activity {
    private static Bitmap bitMap;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout l = new LinearLayout(this);

        bitMap = Bitmap.createBitmap(getWindowManager().getDefaultDisplay().getWidth(), 
                getWindowManager().getDefaultDisplay().getHeight(), 
                Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitMap);
        LayoutInflater inflater = LayoutInflater.from(this);
        View v1 = inflater.inflate(R.layout.main, null);
        v1.layout(0, 0, getWindowManager().getDefaultDisplay().getWidth(), 
                getWindowManager().getDefaultDisplay().getHeight());
        v1.draw(canvas);

        ImageView i1 = new ImageView(this);
        i1.setImageBitmap(bitMap);
        i1.setAdjustViewBounds(true);
        i1.setLayoutParams(new FrameLayout.LayoutParams(getWindowManager().getDefaultDisplay().getWidth(), 
                getWindowManager().getDefaultDisplay().getHeight()));

        l.addView(i1);
        setContentView(l);
    }
}

很不幸,位图没有被正确创建。我做错了什么吗?


1
嗯,我不知道我能清楚到什么程度,因为我已经把所有的代码都放在这里了。我只想要展开一个布局,从中获取一个视图,并使用它来获取位图。但是,我的解决方案无法正常工作。那么,我该如何使其正常工作呢? - OckhamsRazor
3个回答

28

将一个布局转换为位图。

FrameLayout view = (FrameLayout)findViewById(R.id.framelayout);
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bm = view.getDrawingCache();

2
谢谢。然而,这会在你的第二行代码上产生一个空指针异常。 - OckhamsRazor
1
你需要提供布局的根视图的id(你不需要进行强制转换)。Polam的根视图是一个FrameLayout,其android:id="@+id/framelayout"。 - FunkTheMonk
当我在onCreate()中使用它时,我的应用程序会FC。 - Si8
1
你不需要调用 "buildDrawingCache();",因为 "getDrawingCache();" 已经在执行它了。 - Joan
1
@AnandSavjani 和 @OckhamsRazor;对于那些收到 null 的人:https://dev59.com/UHE95IYBdhLWcg3wXsyR#4618030 - Mir-Ismaili
显示剩余4条评论

3
    /***
 * 
 * @param flameLayout/linearLayout...
 * @param width
 * @param height
 * @return
 */
public static Bitmap viewToBitmap(View view, int width, int height) {
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}

1
也许可以解释一下你的代码在做什么,以及为什么选择这样做。 - JamesENL

2

如果视图或布局未被填充,则无法获取位图。

布局只有在OnCreate()之后才会被填充。

.

1. 在 Button_Clicked(View view){} 中获取位图。

2. 或者使用 Handle() 延迟发布获取位图。

3. 确保使用 view.buildDrawingCache(); 创建绘图缓存。


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