Android 以编程方式设置背景颜色的百分比

Android 以编程方式设置背景颜色的百分比,android,view,gradient,background-color,Android,View,Gradient,Background Color,假设我只想为线性布局的64%背景上色。我想把它从左到右涂成纯色 起初,我尝试使用渐变绘图,因为它允许我指定颜色的方向和颜色…但它不允许我指定百分比。如果我可以在xml绘图中这样做,这将是理想的,但是百分比将发生变化,我需要根据百分比重新调整背景 下面是我为整个视图着色的代码。有没有一种方法可以只显示35%的视图而不是整个视图 GradientDrawable gradient = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIG

假设我只想为线性布局的64%背景上色。我想把它从左到右涂成纯色

起初,我尝试使用渐变绘图,因为它允许我指定颜色的方向和颜色…但它不允许我指定百分比。如果我可以在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>

您可以使用
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>

我认为这是不可能的,相反,您可以尝试使用嵌套的linearlayouts并使用权重属性(指定百分比)

示例:

<?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>

我认为这是不可能的,相反,您可以尝试使用嵌套的linearlayouts并使用权重属性(指定百分比)

示例:

<?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>

这完全是可能的,方法不多,但我建议使用自定义可绘制,例如:

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是简单的线性布局,具有匹配父对象w/h,也可以是简单视图。您应该使xml布局尽可能简单。

这完全是可能的,没有几种方法可以做到,但我建议使用自定义绘图,例如:

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是简单的线性布局,具有匹配父对象w/h,也可以是简单视图。您应该使xml布局尽可能简单。

但我该如何为其着色?这就是我遇到的问题。以编程方式获取屏幕大小,并将其设置为您的视图的%。但如何为其着色?这就是我遇到的问题。以编程方式获取屏幕大小并将其设置为您的视图的%。您非常接近:使用ClipDrawable代替GradientDrawable使用ClipDrawable,忘记以下带有其他视图的答案等。您非常接近:使用ClipDrawable代替GradientDrawable,忘了下面的答案,还有其他的观点等等…这正是我想要的。谢谢你,先生@cj1098自定义绘图是一个很好的尝试,但ClipDrawable将做同样的2或3行代码正是我所寻找的。谢谢你,先生@cj1098自定义绘图是一个很好的尝试,但ClipDrawable将使用2或3行代码执行相同的操作