我想以编程方式设置 textview 的顶部填充。我知道你可以用方法做到这一点setPadding()
。但是问题是这个方法需要4个参数:left、top、right、bottom。我不想改变左右和底部,我只想改变顶部填充。
那可能吗?
我想以编程方式设置 textview 的顶部填充。我知道你可以用方法做到这一点setPadding()
。但是问题是这个方法需要4个参数:left、top、right、bottom。我不想改变左右和底部,我只想改变顶部填充。
那可能吗?
利用
yourTextView.setPadding(0, 10, 0, 0);
仅调整您需要的参数并将其他参数设置为零。
如果您需要保留其他现有填充,请使用yourView.getPaddingLeft()
,yourView.getPaddingTop()
等等。
我通常创建一个简单的实用方法只是为了不忘记或放错其他填充:
public static void setPaddingLeft(View v, int leftPaddingDp) {
int leftPaddingPx = dpToPx(leftPaddingDp);
v.setPadding(leftPaddingPx, v.getPaddingTop(), v.getPaddingRight(), v.getPaddingBottom());
}
稍后像这样使用,提供 dp 单位,就像在 xmls 中一样:
Utils.setPaddingLeft(myExampleTextView, 10)
您可以为每个特定面添加这样的扩展变量。
inline var View.topPadding: Int
get() = paddingTop
set(@Px value) = setPadding(paddingLeft, value, paddingRight, paddingBottom)
// Then call
myView.topPadding = 10 // px
如果要使用dp
而不是px
,请添加如下内容:
inline var View.rightPaddingDp: Float
get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, paddingRight.toFloat(), resources.displayMetrics)
set(value) {
val rightPx = resources.displayMetrics.density * value
setPadding(paddingLeft, paddingTop, rightPx.toInt(), paddingBottom)
}
myView.rightPaddingDp = 10 // dp
要处理horizontal
or vertical
,请执行以下操作。请注意,getter 结果没有意义,因此您可以禁用它。
inline var View.horizontalPadding: Int
get() = throw UnsupportedOperationException("No getter for property")
set(@Px value) = setPadding(value, paddingTop, value, paddingBottom)
要使用start
或end
正确处理 RTL 语言,您需要添加以下内容:
inline val View.isLtr get() = SDK_INT < 17 || layoutDirection == View.LAYOUT_DIRECTION_LTR
inline var View.startPadding: Int
get() = if (isLtr) paddingLeft else paddingRight
set(@Px value) {
val left = if (isLtr) value else paddingLeft
val right = if (isLtr) paddingRight else value
setPadding(left, paddingTop, right, paddingBottom)
}
奖励:制作一个需要res
. IEtopPaddingRes
你也可以使用这个
setPadding(view, 500, Padding.TOP);
在@IntDef定义的帮助下:
public static void setPadding(View view, int padding, @Padding.Direction int direction) {
switch (direction) {
case Padding.LEFT:
view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());
return;
case Padding.RIGHT:
view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), padding, view.getPaddingBottom());
return;
case Padding.TOP:
view.setPadding(view.getPaddingLeft(), padding, view.getPaddingRight(), view.getPaddingBottom());
return;
case Padding.BOTTOM:
view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), padding);
return;
default:
}
}
public static class Padding {
@IntDef({Padding.LEFT, Padding.RIGHT, Padding.TOP, Padding.BOTTOM})
@Retention(RetentionPolicy.SOURCE)
public @interface Direction {}
public static final int LEFT = 0;
public static final int RIGHT = 1;
public static final int TOP = 2;
public static final int BOTTOM = 3;
}
下面的代码工作正常。
float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);
一个 kotlin 视图扩展,用于为任何视图类型一次性将任何边缘组合设置为相同的值:
enum class Edge{
TOP,
LEFT,
BOTTOM,
RIGHT
}
fun View.padding(edges:Set<Edge>, value:Int){
var top = paddingTop
var left = paddingLeft
var bottom = paddingBottom
var right = paddingRight
for(edge in edges){
when(edge){
Edge.TOP -> top = value
Edge.LEFT -> left = value
Edge.BOTTOM -> bottom = value
Edge.RIGHT -> right = value
}
}
setPadding(left, top, right, bottom)
}
例子:
someView.padding(setOf(Edge.RIGHT, Edge.LEFT), 50)