我有一个活动,我想显示一个占据应用程序前四分之一的标题,并显示一组动态文本.在某些情况下,它将全部放在一条线上,我希望字体大小可以调整大小,因此它很大且易于阅读.在某些情况下,它将在多行(通常小于4)并且需要更小.
复杂的是,如果我在setText中明确设置换行符,它有时会插入一个我不想要的换行符,即:
"My first line of text\nMy Second line of text" Might get turned into (it's right adjusted in this version): "My first line of text My second line of text"
我不确定如何保持TextView不要试图插入换行符或让它只是处理格式化整个事情.如果我将一些文本设置为一个非常长的单个单词,它将在某个选定点的中间插入换行符.有时我只是随机得到最后几行文字.
我是否应该明确地将字体大小设置为非常小以使其正确布局然后手动调整大小?我应该使用"最佳实践"吗?如果我将字体大小设置为一个相当大的字体,那么它的工作方式很有用,但要弄清楚这样做的"正确"方法会很好.而且我宁愿不必手动添加4个单行TextView并自己格式化.
我正在使用的布局xml是:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_marginTop="10dip"
android:layout_marginRight="8dip"
android:singleLine="false"
android:ellipsize="marque"
android:gravity="right|bottom"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="30sp"
/>
Run Code Online (Sandbox Code Playgroud) 当您在Android 2.2+中创建LiveWallpaper时,您将获得一个画布(或任何3D等效物).我想使用内置的Android UI工具绘制一些元素,而不是使用canvas命令从头开始构建所有元素或加载预渲染的UI位图.
将单个视图转换为位图工作正常.即这很好:
// For example this works:
TextView view = new TextView(ctx);
view.layout(0, 0, 200, 100);
view.setText("test");
Bitmap b = Bitmap.createBitmap( 200, 100, Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
view.draw(tempC);
c.drawBitmap(b, 200, 100, mPaint);
Run Code Online (Sandbox Code Playgroud)
但是,使用子项转换LinearLayout会导致问题.你只能得到LinearLayout本身,而不是它的孩子.例如,如果我将LinearLayout设置为具有白色背景,则会获得一个很好地渲染的白色框,但是Bitmap中没有任何TextView子项.我也尝试过使用类似结果的DrawingCache.
我正在使用的代码是多维数据集示例,唯一的更改是额外的绘制命令.LinearLayout可以作为toast或常规视图(即一切都很好地显示),在LiveWallpaper上我得到的是LinearLayout的背景渲染.
inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layout = (LinearLayout) inflater.inflate(com.example.android.livecubes.R.layout.testLinearLayout, null);
layout.layout(0, 0, 400, 200);
Bitmap b = Bitmap.createBitmap( 400, 200, Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
layout.draw(tempC);
c.drawBitmap(b, 10, 200, mPaint);
Run Code Online (Sandbox Code Playgroud)
有没有人知道你是否需要做一些特别的事情来让孩子们正确地渲染到我的位图?即我是否需要以某种方式做一些特殊的事情来使布局渲染其余的孩子?我应该写一个函数来递归地对所有孩子做些什么吗?
我可以自己合成一切但是,因为显示是相当静态的(即我画了一次并保留了位图的副本以在背景上绘制)这对我来说似乎更容易并且仍然非常有效.
编辑: 在进一步挖掘布局的状态时,看起来好像布局没有沿着视图树向下移动(即,当我调用layout()时,LinearLayout得到它的布局,但子窗口的大小为null(0x0) ).根据Romain Guy在2008年安卓开发者帖子中的帖子.您必须等待布局传递或自己强制布局.问题是我如何等待壁纸引擎的布局传递给没有连接到根视图组的LinearLayout?如果布局要求您在我不知道这些应该是什么时设置左,上,右,下,我该如何手动布局每个子元素.
我试过在孩子身上调用forceLayout,但似乎也没有帮助.我不确定布局框架如何在幕后工作(除了它做了两遍布局).有没有办法手动让它做布局通过,即现在?由于它不是一个活动我不认为很多正常的背景材料正在发生我想要的方式.