Android计量单位有什么区别?
user-interface android units-of-measurement dimension android-layout
我创建了我的应用程序,其高度和宽度以像素为单位,用于分辨率为480x800的Pantech设备.
我需要转换G1设备的高度和宽度.我认为将其转换为dp将解决问题,并为两种设备提供相同的解决方案.
有没有简单的方法将像素转换为dp?有什么建议?
我试图计算可变数量的像素到密度独立像素,反之亦然.
此公式(px to dp): dp = (int)(px / (displayMetrics.densityDpi / 160));不适用于小型设备,因为它除以零.
这是我的dp to px公式:
px = (int)(dp * (displayMetrics.densityDpi / 160));
Run Code Online (Sandbox Code Playgroud)
有人可以给我一些指示吗?
是否可以更改单位Paint.setTextSize()?据我所知,它是像素,但我喜欢在DIP中设置文本大小以支持多屏幕.
我需要在当前TextSize的TextView在sp单位.
但是getTextSize()返回大小pixels.那有办法convert pixels to sp吗?
当我设计布局时,由于可维护性的主题,我集中了dimens.xml中的所有维度.我的问题是,这是否正确.什么是最好的做法?关于此的信息非常少,没什么.我知道在strings.xml上集中布局的所有字符串,colors.xml上的颜色是个好主意.但关于尺寸?
例如:
<TableLayout
android:id="@+id/history_detail_rows_submitted"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/cebroker_history_detail_rows_border"
android:collapseColumns="*">
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/history_detail_rows_margin_vertical"
android:background="@color/cebroker_history_detail_rows_background"
android:gravity="center"
android:paddingBottom="@dimen/history_detail_rows_padding_vertical"
android:paddingLeft="@dimen/history_detail_rows_padding_horizontal"
android:paddingRight="@dimen/history_detail_rows_padding_horizontal"
android:paddingTop="@dimen/history_detail_rows_padding_vertical">
<TextView
android:layout_width="match_parent"
android:drawableLeft="@mipmap/ic_history_detail_submitted_by"
android:drawablePadding="@dimen/history_detail_rows_textviews_padding_drawable"
android:gravity="left|center"
android:paddingRight="@dimen/history_detail_rows_textviews_padding"
android:text="@string/history_detail_textview_submitted_by"
android:textColor="@color/cebroker_history_detail_rows_textviews"
android:textSize="@dimen/history_detail_rows_textviews_text_size" />
Run Code Online (Sandbox Code Playgroud) 我制作了自定义组件,只是将几个TextView放在一起.现在我希望能够直接从代码启动我的自定义控件,为每个电视独立传递文本大小
我的属性定义:
<resources>
<declare-styleable name="BasicGauge">
<attr name="valueTextSize" format="dimension" />
<attr name="titleTextSize" format="dimension" />
<attr name="unitsTextSize" format="dimension" />
</declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)
组件的示例初始化:
<pl.com.digita.BikeComputerUi.customviews.BasicGauge
android:id="@+id/basicGauge1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="10dp"
valueTextSize="40sp">
</pl.com.digita.BikeComputerUi.customviews.BasicGauge>
Run Code Online (Sandbox Code Playgroud)
我如何尝试在组件的构造函数中读取这些属性:
final int N = typedArray.getIndexCount();
for (int i = 0; i < N; i++) {
int attribute = typedArray.getIndex(i);
switch (attribute) {
case R.styleable.BasicGauge_valueTextSize:
valueTextSize = typedArray.getString(attribute);
break;
case R.styleable.BasicGauge_titleTextSize:
titleTextSize = typedArray.getString(attribute);
break;
case R.styleable.BasicGauge_unitsTextSize:
unitsTextSize = typedArray.getString(attribute);
break;
}
typedArray.recycle();
}
Run Code Online (Sandbox Code Playgroud)
问题: 创建后,我的所有值仍为空.40sp正是我想要的值.
我有一个包含两个TextView的自定义组件,它们具有自定义大小设置方法(两个文本视图的比例约为1:2).由于这是RelativeLayout的子类,它没有textSize属性,但我想知道是否仍然可以android:textSize在该组件的XML实例化中设置该属性,然后textSize从AttributeSet中获取属性以使用setSize()在构造函数中使用我的自定义方法.
我已经看到了使用自定义属性执行此操作的技术,但是如果我想获取已经在android词典中的属性怎么办?
例如,在特定的布局中,我有以下XML:
<GridView
android:id="@+id/gridView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="3dp"
android:columnWidth="48dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="spacingWidth" />
Run Code Online (Sandbox Code Playgroud)
此网格视图特定于此布局,我不认为我将使用具有类似属性的任何其他网格视图.这就是说代码中的维度值特定于该网格视图.
我是否应该将它们移动到dimens.xml文件中,或者将它们留下来就可以了?如果是这样,仅当在多个布局中使用该值时,我是否应该在dimens.xml文件中放置值?
我已经创建了一个自定义视图,onDraw()覆盖了画布上的位图.当我在布局文件中指定我想要它wrap_content时,它仍然会填满整个屏幕.onMeasure()这样说:
measure的基类实现默认为背景大小,除非允许更大的大小
MeasureSpec.子类应覆盖onMeasure(int,int)以提供更好的内容测量.
好酷,所以我知道我需要覆盖onMeasure()和使用MeasureSpec.根据这个答案
unex表示layout_width或layout_height值设置为wrap_content.你可以任意大小.
现在我遇到了我的问题,我如何onMeasure()测量我尚未创建的位图并测量/包装它?我知道其他Android视图必须做一些事情,因为如果设置为wrap_content,它们不会阻挡整个屏幕.提前致谢!
我有与包括布局的活动AdView有ads:adSize="SMART_BANNER"。它位于屏幕底部,在custom下方WebView。现在,WebView具有基于可用空间(像素尺寸)呈现的内容。因此,在渲染WebView内容之前,我需要知道SMART_BANNER将要占据的大小(尤其是高度),以及因此需要保留的大小WebView。从这里它指出,智能旗帜的高度可以是中的任何一个32dp,50dp和90dp。
据我所知,我需要等待AdView决定格式之后才能呈现WebView。我怎样才能做到这一点?也许通过设置AdListener?然而,该方法的AdListener似乎只是让我来决定,例如当一个广告被加载中...我不希望有等待广告加载,我只是想等待广告的实际大小被分配。
我知道我可以通过将设置AdView为BANNER,并将高度固定为来避免所有这些情况50dp,并且确实可以正常工作。但是我更喜欢SMART_BANNER主要是因为高度可以缩小到32dp小手机屏幕上的横向模式,从而为实际内容留出更多空间。
我需要在 Android 中以编程方式将可缩放像素 (sp) 转换为像素。我已经知道如何将 dp 转换为像素,但是如何将 sp 转换为像素?