修改进度条资源图片

     2023-02-26     85

关键词:

【中文标题】修改进度条资源图片【英文标题】:Modifying the resource image of Progress Bar 【发布时间】:2016-04-04 19:33:10 【问题描述】:

我想为 Android 创建一个进度条。我的方形进度条有四个图像。

我使用的是android定义的进度条:

<ProgressBar
     android:layout_
     android:layout_
     style="@android:style/Widget.ProgressBar.Small"
     android:layout_marginRight="5dp" />

但是如果我想制作一个正方形而不是圆形,我该怎么做呢?如何将我的 4 张图片传递到进度条?

示例:

【问题讨论】:

@NileshSingh 我的问题涉及图像,即颜色。 您需要有自己的方法。放一些你写的代码,以便其他人能够提供帮助。 【参考方案1】:

通常你有 2 个选项

1.如前所述,使用animation-list 并交换图片。

这可能是更简单的解决方案,因为它们可以相对容易地使用AnimationDrawable 进行动画处理。唯一的缺点是您需要至少 16 张图像(所有分辨率)才能获得给定的结果。

2。使用自定义可绘制对象。

这是更复杂的方法。您必须自己进行绘图和动画制作,这对于大多数没有良好文档的人来说是一项艰巨的任务。

因此你必须extends Drawable implements Runnable, Animatable 并提供一些好的实现。

以下是一个基本的实现,计算一次位置,然后绘制它们。动画(单个圆圈的大小)可以而且应该进一步调整;)

导致 3 个变体:

public class RectProgressDrawable extends Drawable implements Runnable, Animatable 
    private static final long FRAME_DELAY = 1000 / 60;
    private static final String TAG = "RectProgressDrawable";
    private boolean mRunning = false;
    private long mStartTime;
    private int mDuration = 1000;

    private Paint mPaint;

    private float[] posX;
    private float[] posY;
    private float mSize;
    private int mPoints = 5;

    /**
     * The padding in px.
     */
    private int mPadding = 4;
    private int mAnimatedPoints = 5;

    public void setPoints(int points) 
        if (points != mPoints) 
            mPoints = points;
            init();
        
    

    private void init() 
        if (mPaint == null) 
            mPaint = new Paint();
            mPaint.setColor(Color.WHITE);
            mPaint.setAntiAlias(true);
            mPaint.setStyle(Paint.Style.FILL);
        

        posX = new float[(mPoints - 1) * 4];
        posY = new float[(mPoints - 1) * 4];

        Rect bounds = new Rect();
        bounds.set(getBounds());
        bounds.inset(mPadding, mPadding);

        float cellWidth = ((float) bounds.width()) / ((float) mPoints);
        float cellHeight = ((float) bounds.height()) / ((float) mPoints);

        float min = Math.min(cellWidth, cellHeight);
        mSize = min / (mPoints - 1);

        for (int i = 0; i < mPoints; i++)  // top row
            posX[i] = bounds.left + cellWidth * (float) i + cellWidth / 2;
            posY[i] = bounds.top + cellHeight / 2;
        
        for (int i = 0; i < mPoints - 2; i++)  // sides
            // right side top bottom
            posX[mPoints + i] = bounds.left + cellWidth * (mPoints - 1) + cellWidth / 2;
            posY[mPoints + i] = bounds.top + cellHeight * (i + 1) + cellHeight / 2;
            //left side bottom top
            posX[3 * mPoints - 2 + i] = bounds.left + cellWidth / 2;
            posY[3 * mPoints - 2 + i] = bounds.top + cellHeight * (mPoints - 2 - i) + cellHeight / 2;
        
        for (int i = 0; i < mPoints; i++)  // bottom from right to left
            posX[2 * mPoints - 2 + i] = bounds.left + cellWidth * (mPoints - 1 - i) + cellWidth / 2;
            posY[2 * mPoints - 2 + i] = bounds.top + cellHeight * (mPoints - 1) + cellHeight / 2;
        
    

    @Override
    public void draw(Canvas canvas) 
        if (isRunning()) 
            // animation in progress
            final int save = canvas.save();

            long timeDiff = SystemClock.uptimeMillis() - mStartTime;

            float progress = ((float) timeDiff) / ((float) mDuration); // 0..1
            int level = ((int) (progress * posX.length)) % posX.length; // current value 0..posX.length

            for (int i = 0; i < posX.length; i++) 
                if ((i >= level && i < level + mAnimatedPoints) || level + mAnimatedPoints > posX.length && i < (level + mAnimatedPoints) % posX.length) 
                    float num = (i - level + posX.length) % posX.length; // 0..5
                    float size = mSize * (1 + (num * (1f / mAnimatedPoints)));
                    float sizeNext = mSize * (1 + ((num + 1) * (1f / mAnimatedPoints)));

                    float levelProgress = progress * posX.length - (int) (progress * posX.length);
                    float currentSize;
                    if (num == (mAnimatedPoints - 1)) 
                        // grow to next size
                        currentSize = mSize + (size - mSize) * levelProgress;
                     else 
                        // shrink
                        currentSize = size + (sizeNext - size) * (1 - levelProgress);
                    

                    canvas.drawCircle(posX[i], posY[i], currentSize, mPaint);
                 else 
                    canvas.drawCircle(posX[i], posY[i], mSize, mPaint);
                
            

            canvas.restoreToCount(save);
         else 
            // draw normal
            for (int i = 0; i < posX.length; i++) 
                canvas.drawCircle(posX[i], posY[i], mSize, mPaint);
            
        
    

    @Override
    public void setBounds(int left, int top, int right, int bottom) 
        super.setBounds(left, top, right, bottom);
        init();
    

    @Override
    public void setAlpha(int alpha) 

    

    @Override
    public void setColorFilter(ColorFilter colorFilter) 

    

    @Override
    public int getOpacity() 
        return 0;
    

    @Override
    public void start() 
        if (mRunning) stop();
        mRunning = true;
        mStartTime = SystemClock.uptimeMillis();
        invalidateSelf();
        scheduleSelf(this, SystemClock.uptimeMillis() + FRAME_DELAY);
    

    @Override
    public void stop() 
        unscheduleSelf(this);
        mRunning = false;
    

    @Override
    public boolean isRunning() 
        return mRunning;
    

    @Override
    public void run() 
        invalidateSelf();
        long uptimeMillis = SystemClock.uptimeMillis();
        if (uptimeMillis + FRAME_DELAY < mStartTime + mDuration) 
            scheduleSelf(this, uptimeMillis + FRAME_DELAY);
         else 
            mRunning = false;
            start();
        
    

    public void setAnimatedPoints(int animatedPoints) 
        mAnimatedPoints = animatedPoints;
    

搭配使用

    ProgressBar progressBar = (ProgressBar) findViewById(R.id.progress);
    progressBar.setIndeterminateDrawable(new RectProgressDrawable());
    progressBar.setIndeterminate(true);

您也可以在工作项目here中查看完整的源代码

【讨论】:

【参考方案2】:

我正在使用一堆图像和animation-list

<?xml version="1.0" encoding="utf-8"?>
<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/loadingAnimationImageView"
    android:layout_
    android:layout_
    android:background="@drawable/loading_progress_indicator_animation" />

还有res\drawable\loading_progres_indicator_animation.xml:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/selected"
    android:oneshot="false">
    <item
        android:drawable="@drawable/loading_progress_indicator_0"
        android:duration="40" />
    <item
        android:drawable="@drawable/loading_progress_indicator_1"
        android:duration="40" />
    <item
        android:drawable="@drawable/loading_progress_indicator_2"
        android:duration="40" />
    .....
    <item
        android:drawable="@drawable/loading_progress_indicator_11"
        android:duration="40" />
    <item
        android:drawable="@drawable/loading_progress_indicator_12"
        android:duration="40" />
</animation-list>

每个loading_progress_indicator_XX 图像都是进度指示器。

带有指示器的自定义视图:

public final class LoadingAnimationView extends FrameLayout 

    ImageView loadingAnimationImageView;
    AnimationDrawable loadingProgressAnimation;
    Handler handler = new Handler(Looper.getMainLooper());

    public LoadingAnimationView(Context context) 
        super(context);
        initialize();
    

    private void initialize() 
        LayoutInflater.from(getContext()).inflate(R.layout.view_loading_videoview, this);
        loadingAnimationImageView = (ImageView)getView().findViewById(R.id.loadingAnimationImageView);
        loadingProgressAnimation = (AnimationDrawable) loadingAnimationImageView.getBackground();
        adaptToVisibility(getVisibility());
    

    @Override
    public void setVisibility(int visibility) 
        super.setVisibility(visibility);
        adaptToVisibility(visibility);
    

    void adaptToVisibility(final int visibility) 
        if (visibility == VISIBLE) 
            loadingProgressAnimation.start();
            //This is to avoid "blinking" of progress indicator (if page is loading from cache)
            handler.postDelayed(new Runnable() 
                @Override
                public void run() 
                    loadingAnimationImageView.setVisibility(visibility);
                
            , 200);
         else 
            loadingProgressAnimation.stop();
            loadingAnimationImageView.setVisibility(visibility);
        
    

因此,就我而言,它看起来像:

因此,您只需要像上面那样的指示器和自定义视图的状态。

要获取指标的状态,您可以将gif 转换为pngs 列表,我建议使用EzGif service:

p>@98

另一种选择 - 您可以重复使用几十个加载指示器的自定义实现之一,例如 this one(它与您的指示器有一些足够接近)或 this one(尽管大多数开源指标是圆形的)。

希望对你有帮助。

【讨论】:

【参考方案3】:

是的,您需要为此创建一个自定义视图,但是还有一个额外的 Android 库可能对您有所帮助。

请查看:https://github.com/mrwonderman/android-square-progressbar

使用该库的示例:

还要检查这个:How to make a Square progress-bar with changing color in certain time interval?

您将在此处了解如何创建您自己的此库的实现。

希望对你有帮助

【讨论】:

@J_Strauton,也检查一下***.com/questions/24218153/…

请教winform进度条怎样改变颜色

...lder,在地址栏找到“进度条”--“常规”,可以看到可以修改的有好多项。通常我们只需要修改“流动状态”即可。流动状态有三种,分别是硬盘的膨胀、停顿和正常状态。这里笔者以修改硬盘的正常状态为例来给大家讲解下怎... 查看详情

unity简单的进度条实现(代码片段)

...用的是自带场景)载入时的场景布局:要将Load的ImageType修改为Filled,FillMethod修改为Horizontal具体代码如下:1usingSystem.Collections;2usingUnityEngine;3usingUnityEngin 查看详情

用js写一个网页进度条

...函数内部,遍历图片数组加载图片,每加载完一张图片,修改进度条进度,直至全部加载完成,进度条进度为100%。二、实现步骤(1)先搭建 查看详情

phaser中很多对象都有一个anchor属性

...前加载,有时候如果资源很多,就有必要做一个资源加载进度的页面,提高用户等待的耐心。这里我们用一个state来实现它,命名为preload。因为资源加载进度条需要一个进度条的背景图片,所以在制作这个state前,我们还需要另一... 查看详情

libgdx之assetmanager资源管理器及进度条的实现

概述在前面我们用到的游戏资源,是直接加载的,由于只是一个demo,资源比较少,因此看不出时间用到的长短。实际上我们在游戏开发过程中用到的图片,声音等资源比较多,这时加载游戏过程中会出现... 查看详情

图片下载进度条

】图片下载进度条【英文标题】:progressbarwhendownloadingimage【发布时间】:2010-06-2419:10:56【问题描述】:我将如何添加一个进度条来下载大图像或任何文件?这是我的代码:NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUs... 查看详情

libgdx之assetmanager资源管理器及进度条的实现

...f0c;这时我们需要AssetManager来异步加载资源,同时实现进度条给用户友好的体验。简单介绍AssetManager中常用的方法*voidclear()清空和销毁已加载和预加载的资源*voiddispose()AssetManager是很耗内存的,不用事要销毁*voidfinishLoading()... 查看详情

pygame六种方法教会你画进度条,其实也不难!(代码片段)

pygame六种方法教会你画进度条,其实也不难!好的,直接开始。文章目录一、标准动作,先初始化个主界面二、第一种进度条(一)核心代码(二)设置步长,并循环递增(三)完整代... 查看详情

vb中的进度条怎么用??

...试吧..临时写的.没有调试有问题QQ:86711527注明如果你要用进度条的话也很简单.bar1为你添加的MS组件中的procressbar控件dimiaslongbar1.min=0bar1.max=2005fori=0to2005bar1.value=idoeventsnexti前面写的是用图片控件做进度条.方法2这个是COPY别人的采用... 查看详情

progress进度条的样式修改(代码片段)

...要进度条,我就想着用progress标签,可是progress标签很难修改样式,因而在网上查询了一番。现在总结一下。progress是H5新标签,主要用于显示进度条。由于他是H5新标签,因而它存在一些兼容问题。看看他的兼容性:由此可看,pr... 查看详情

在unity3d里怎么做进度条

...lbar窗口中,选中Control-ColoredProgressBar拖拽至Hierarchy面板,修改名字为”Loading“。三、在Hierarchy面板,Loading添加子物体Label,Label的Context内容为“loading”,适当调整字体大小。创建脚本LoadingScripts,UIRoot的摄像机Camera添加组件Loadi... 查看详情

自定义view基础之——图片加载进度条

...后,我们就可以动手开始实践了,先写个简单的图片加载进度条看看。按照惯例,先看效果图,再决定要不要往下看:既然看到这里了,应该是想了解这个图片加载进度条了,我们先看具体用法,再看自定义View的实现:<Relativ... 查看详情

第二周学习进度条

...时左右。代码量:56+12+29+110+55+6+66+200=534行左右,不包括修改代码,只统计了成品。博客量:http://www.cnblogs.com/fylove/p/6490004.html(软件工程个人作业01)和本篇。了解到的知识点:1.网页中的一些特效的JavaScript代码和应用,有:图... 查看详情

笔记canvas图片预加载及进度条的实现

/*star*loading模块*实现图片的预加载,并显示进度条*参数:图片数组对象,加载完成的回调函数*/functionloadImages(sources,callback){varloadedImages=0;varnumImages=0;ctx.font=‘14pxbold‘;ctx.lineWidth=5;varclearWidth=canvas.width;varclearHeigh 查看详情

html上传图片(进度条变化)音乐

<html><head><title>$Title$</title></head><linkhref="css/bootstrap.css"rel="stylesheet"/><scriptsrc="js/jquery-1.11.3.js"></script><script>$(functi 查看详情

android开发_layerlistdrawable(层叠图片)在进度条中的应用

1创建工程,准备好进度条背景图片和进度图片,放在res-drawable-hdpi文件夹中2在activity_main.xml中创建“进度条控件”  3在res文件夹下创建drawable文件夹,并创建Layer-list类型的文件,创建出来的问价夹后缀为.xml(相当... 查看详情

android自定义圆弧进度条(半圆进度条)圆弧渐变色进度条带指示圆弧宽高可自由修改(代码片段)

首先我们来看下效果图圆弧高度可以自定义,说明,只有高度设置为宽度的二分之一时,才是半圆,否则就是半圆的一部分,即圆弧。不只是圆弧是自定的,图中的文字“2”的控件也是自定义的,下面... 查看详情

每周进度条(第十五周)

第十五周进度条 第十五周所花时间1h代码量(行) 100博客量(篇) 1学到的知识对图片的处理在Android程序中加入图片 查看详情