以编程方式设置背景颜色的百分比
Setting % of a background color programmatically
假设我只想为线性布局的 64% 的背景着色。我想从左到右给它上色,让它成为纯色。
起初我尝试使用 Gradient Drawables,因为它允许我指定颜色的方向和颜色...但它不允许我指定 %。如果我可以在 xml 可绘制对象中执行此操作,那将是理想的,但百分比将发生变化,我需要根据百分比重新调整背景。
这是我为整个视图着色的代码。有没有办法只给视图的 35% 而不是整个视图着色?
GradientDrawable gradient = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
new int[] {getContext().getResources().getColor(R.color.icitizen_poll_opaque_gold),
getContext().getResources().getColor(R.color.icitizen_poll_opaque_gold)});
gradient.setCornerRadius(1f);
v.setBackground(gradient);
您可以使用 FrameLayout
在您的布局下创建另一个布局并为其背景着色。
<FrameLayout
android:layout_height="match_parent"
android:layout_width="match_parent">
<LinearLayout
android:layout_height="match_parent"
android:layout_width="0dp"/> // set 35% of screen programmatically
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"/>
</FrameLayout>
How to get screen size:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
我认为这是不可能的,您可以尝试使用嵌套线性布局并使用权重属性(指定 %)
示例示例:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.7"
android:background="@android:color/darker_gray">
</LinearLayout>
<LinearLayout android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.3"
android:background="@android:color/black">
</LinearLayout>
</LinearLayout>
完全有可能,方法很少,但我建议使用自定义 Drawable,例如:
public class PercentDrawable extends Drawable {
private final int percent;
private final Paint paint;
public PercentDrawable(int percent) {
super();
this.percent = percent;
this.paint = new Paint(Paint.ANTI_ALIAS_FLAG);
this.paint.setColor(0xffff0000);
}
@Override
public void draw(Canvas canvas) {
canvas.drawRect(0, 0, canvas.getWidth(), percent * canvas.getHeight() / 100, paint);
}
@Override
public void setAlpha(int i) {
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return 0;
}
}
...并使用它:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.background).setBackground(new PercentDrawable(30));
} //... rest of Activity
R.id.background是简单的LinearLayout和match_parentw/h,也可以是简单的View。您应该使 xml 布局尽可能简单。
假设我只想为线性布局的 64% 的背景着色。我想从左到右给它上色,让它成为纯色。
起初我尝试使用 Gradient Drawables,因为它允许我指定颜色的方向和颜色...但它不允许我指定 %。如果我可以在 xml 可绘制对象中执行此操作,那将是理想的,但百分比将发生变化,我需要根据百分比重新调整背景。
这是我为整个视图着色的代码。有没有办法只给视图的 35% 而不是整个视图着色?
GradientDrawable gradient = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
new int[] {getContext().getResources().getColor(R.color.icitizen_poll_opaque_gold),
getContext().getResources().getColor(R.color.icitizen_poll_opaque_gold)});
gradient.setCornerRadius(1f);
v.setBackground(gradient);
您可以使用 FrameLayout
在您的布局下创建另一个布局并为其背景着色。
<FrameLayout
android:layout_height="match_parent"
android:layout_width="match_parent">
<LinearLayout
android:layout_height="match_parent"
android:layout_width="0dp"/> // set 35% of screen programmatically
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"/>
</FrameLayout>
How to get screen size:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
我认为这是不可能的,您可以尝试使用嵌套线性布局并使用权重属性(指定 %)
示例示例:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.7"
android:background="@android:color/darker_gray">
</LinearLayout>
<LinearLayout android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.3"
android:background="@android:color/black">
</LinearLayout>
</LinearLayout>
完全有可能,方法很少,但我建议使用自定义 Drawable,例如:
public class PercentDrawable extends Drawable {
private final int percent;
private final Paint paint;
public PercentDrawable(int percent) {
super();
this.percent = percent;
this.paint = new Paint(Paint.ANTI_ALIAS_FLAG);
this.paint.setColor(0xffff0000);
}
@Override
public void draw(Canvas canvas) {
canvas.drawRect(0, 0, canvas.getWidth(), percent * canvas.getHeight() / 100, paint);
}
@Override
public void setAlpha(int i) {
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
}
@Override
public int getOpacity() {
return 0;
}
}
...并使用它:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.background).setBackground(new PercentDrawable(30));
} //... rest of Activity
R.id.background是简单的LinearLayout和match_parentw/h,也可以是简单的View。您应该使 xml 布局尽可能简单。