gpt4 book ai didi

android - 动态 View 创建,将其渲染到 Canvas 时失败

转载 作者:行者123 更新时间:2023-11-29 02:07:23 24 4
gpt4 key购买 nike

您好,我正在尝试绘制一个复杂的 View ,该 View 由 xml 布局定义为位图(随后绘制到 Canvas )。当数据模型发生变化时,该 View 会定期更新。更改静态定义的 TextView 工作完美,但将新 View 添加到 linearLayout 不知何故不起作用。我的错误在哪里?

这就是我添加新 View 的方式:

           linearLayoutContainer.removeAllViewsInLayout();

for (int i = 0 ; i < 5; i ++) {

TextView child = new TextView(getContext());
child.setText("example" + i);
child.setVisibility(View.VISIBLE);
linearLayoutContainer.addView(child, i , new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT));
i++;
}

这就是我创建位图的方式:

    sideBarView.refresh();
sideBarView.invalidate();
sideBarBitmap = sideBarView.getDrawingCache();

这非常适合更新已经在 xml 中定义的 TextView,但新添加的 View 不可见。

我的 xml 布局如下所示:

<?xml version="1.0" encoding="utf-8"?>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="some"
android:textSize="20dp" />

<LinearLayout
android:id="@+id/linearLayoutContainer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="0.33"
android:gravity="center_horizontal" >

<!-- THE CONTAINER -->

</LinearLayout>

<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:layout_weight="0.66"
android:gravity="center"
android:orientation="horizontal" >

<TextView
android:id="@+id/TextView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:text="20%"
android:textSize="30dp" />

<TextView
android:id="@+id/TextView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:text="35%"
android:textSize="30dp" />

</LinearLayout>

最佳答案

我解决了我的问题。通过添加新 View 刷新我的 View 后,我应该再次调用 Root View 上的度量。这是我做错的地方(伪代码):

init code:
created rootView
measure
getDrawingCache
draw

update code:
update rootView
invalidate rootView
getDrawingCache
draw

所以问题出在更新代码中,它没有再次调用测量,因此 subview 没有被重新测量,当然在 Activity 中添加 View 时不会发生这种情况,所以这就是需要的:

update code:
update rootView
measure
invalidate rootView
getDrawingCache
draw

在实际代码中:

private void refreshViews() {

sideBarView.refresh();

sideBarView.measure(
MeasureSpec.getSize(sideBarView.getMeasuredWidth()),
MeasureSpec.getSize(sideBarView.getMeasuredHeight()));
sideBarView.layout(0, 0,
MeasureSpec.getSize(sideBarView.getMeasuredWidth()),
MeasureSpec.getSize(sideBarView.getMeasuredHeight()));

sideBarView.invalidate();
sideBarView.buildDrawingCache();
sideBarBitmap = sideBarView.getDrawingCache();
}

关于android - 动态 View 创建,将其渲染到 Canvas 时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9263683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com