2013-11-02 187 views
0

对于ListView,我想给个别ListView元素某种进度指示器 - 可以这么说,我需要一个进度条列表。 但是,每个列表视图元素都有一些TextView形式的文本重叠,根本不应受进度栏的影响。将线性布局背景分解成不同颜色的部分

我认为图片可以告诉多字在这种情况下,所以这里几乎是我想要的:

background progress bar

我知道我可以添加“sublayouts”个别LinearLayout S和变化的重编程,这看起来有点像这样:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 

<LinearLayout 
    android:id="@leftSide" 
    android:background="@color/green" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_weight="0.8" > 
</LinearLayout> 
<LinearLayout 
    android:id="@rightSide" 
    android:background="@color/red" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_weight="0.2" > 
</LinearLayout> 

</LinearLayout> 

,然后编程方式更改重量为双方(已完成和未完成):

float weightLeft = 0.8f; 
float weightRight = 1f-weightLeft; 

android.widget.LinearLayout.LayoutParams paramsLeft = new android.widget.LinearLayout.LayoutParams(
     LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, weightLeft); 
LinearLayout left = (LinearLayout) findViewById(R.id.leftside); 
left.setLayoutParams(paramsLeft); 

android.widget.LinearLayout.LayoutParams paramsRight = new android.widget.LinearLayout.LayoutParams(
     LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, weightRight); 
LinearLayout right = (LinearLayout) findViewById(R.id.rightside); 
left.setLayoutParams(paramsRight); 

但是 - 现在的问题是,如何让textviews坐在父线性布局上,并忽略子女LinearLayouts

我也可以想象有一种方法可以仅使用drawables来分割背景部分的分布,但我不知道如何做到这一点,尤其是不能编程。

任何帮助表示赞赏!

回答

1

尝试这种风俗可绘制,mFraction是[0..1]:

public class FractionDrawable extends Drawable { 
    private Paint mPaint; 
    private float mFraction; 

    public FractionDrawable(float fraction) { 
     mPaint = new Paint(); 
     setFraction(fraction); 
    } 

    public void setFraction(float fraction) { 
     mFraction = fraction; 
     invalidateSelf(); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     Rect b = getBounds(); 
     mPaint.setColor(0xff00aa00); 
     float x = b.width() * mFraction; 
     canvas.drawRect(0, 0, x, b.height(), mPaint); 
     mPaint.setColor(0xffaa0000); 
     canvas.drawRect(x, 0, b.width(), b.height(), mPaint); 
    } 

    @Override 
    public void setAlpha(int alpha) { 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 
    } 

    @Override 
    public int getOpacity() { 
     return PixelFormat.TRANSLUCENT; 
    } 
} 
+0

真棒!这就像一个魅力!非常感谢 :) – sirio0816

相关问题