1

我想创建一个类似于 gmail 应用程序的进度条(中间进度条)来改变颜色。我可以通过保持和更新来自 sdk/platforms 的 progress_indeterminate_horizo​​ntal.xml 来做到这一点。我不想使用动画(多色图像)。我想使用 xml 来实现这一点(我想使用渐变)。任何帮助将不胜感激。

提前致谢

4

3 回答 3

10

这是我的实现:绘制动画彩虹渐变。酷,如果我自己这么说的话。它不是基于 XML 的,但可以做成这样,而且它确实使用了渐变。也许它会给你一些想法。

设置:

    pb = (ProgressBar) findViewById(R.id.progressbar_Horizontal);
    GradientDrawable rainbow = new GradientDrawable(Orientation.LEFT_RIGHT,
            new int[] {Color.RED, Color.MAGENTA, Color.BLUE, Color.CYAN, Color.GREEN, Color.YELLOW, Color.RED});

    AnimationDrawable ad = getProgressBarAnimation();
    pb.setBackgroundDrawable(ad);

和动画:

    private AnimationDrawable getProgressBarAnimation(){

    GradientDrawable rainbow1 = new GradientDrawable(Orientation.LEFT_RIGHT,
            new int[] {Color.RED, Color.MAGENTA, Color.BLUE, Color.CYAN, Color.GREEN, Color.YELLOW});

    GradientDrawable rainbow2 = new GradientDrawable(Orientation.LEFT_RIGHT,
            new int[] { Color.YELLOW, Color.RED, Color.MAGENTA, Color.BLUE, Color.CYAN, Color.GREEN});          

    GradientDrawable rainbow3 = new GradientDrawable(Orientation.LEFT_RIGHT,
            new int[] { Color.GREEN, Color.YELLOW, Color.RED, Color.MAGENTA, Color.BLUE, Color.CYAN });

    GradientDrawable rainbow4 = new GradientDrawable(Orientation.LEFT_RIGHT,
            new int[] { Color.CYAN, Color.GREEN, Color.YELLOW, Color.RED, Color.MAGENTA, Color.BLUE });

    GradientDrawable rainbow5 = new GradientDrawable(Orientation.LEFT_RIGHT,
            new int[] { Color.BLUE, Color.CYAN, Color.GREEN, Color.YELLOW, Color.RED, Color.MAGENTA });

    GradientDrawable rainbow6 = new GradientDrawable(Orientation.LEFT_RIGHT,
            new int[] {Color.MAGENTA, Color.BLUE, Color.CYAN, Color.GREEN, Color.YELLOW, Color.RED });


    GradientDrawable[]  gds = new GradientDrawable[] {rainbow1, rainbow2, rainbow3, rainbow4, rainbow5, rainbow6};

    AnimationDrawable animation = new AnimationDrawable();

    for (GradientDrawable gd : gds){
        animation.addFrame(gd, 100);

    }

    animation.setOneShot(false);

    return animation;


}

科特林

设置:

    val ad = getProgressBarAnimation()
    progressBar.background = ad

和动画:

fun getProgressBarAnimation(): AnimationDrawable {

    val rainbow1 = GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
            intArrayOf(Color.RED, Color.MAGENTA, Color.BLUE, Color.CYAN, Color.GREEN, Color.YELLOW))

    val rainbow2 = GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
            intArrayOf(Color.YELLOW, Color.RED, Color.MAGENTA, Color.BLUE, Color.CYAN, Color.GREEN))

    val rainbow3 = GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
            intArrayOf(Color.GREEN, Color.YELLOW, Color.RED, Color.MAGENTA, Color.BLUE, Color.CYAN))

    val rainbow4 = GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
            intArrayOf(Color.CYAN, Color.GREEN, Color.YELLOW, Color.RED, Color.MAGENTA, Color.BLUE))

    val rainbow5 = GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
            intArrayOf(Color.BLUE, Color.CYAN, Color.GREEN, Color.YELLOW, Color.RED, Color.MAGENTA))

    val rainbow6 = GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
            intArrayOf(Color.MAGENTA, Color.BLUE, Color.CYAN, Color.GREEN, Color.YELLOW, Color.RED))


    val gds = arrayListOf(rainbow1, rainbow2, rainbow3, rainbow4, rainbow5, rainbow6)

    val animation = AnimationDrawable()

    for (gd in gds) {
        animation.addFrame(gd, 100)
    }

    animation.isOneShot = false;

    return animation;
}
于 2014-12-22T13:06:30.690 回答
1

这就是你要找的。在你的项目中添加这个库,你就可以使用它了。

然后你就可以把它当作一个普通的进程栏了。例子:

private SmoothProgressBar  mProgressBar;

创建时:

mProgressBar = (SmoothProgressBar) findViewById(R.id.progressbar);
mProgressBar.progressiveStart();

暂停:

mProgressBar.progressiveStop();
于 2014-12-22T12:39:29.487 回答
0

如果您正在使用材料设计库,制作线性进度条contiguous可能是您想要的。

  • 在具有此属性的布局中:
    app:indeterminateAnimationType
    
  • 或以编程方式使用此方法:
    setIndeterminateAnimationType()
    

请参阅此处了解更多信息。

于 2021-01-08T08:58:58.510 回答