`

把任意Drawable转换成基于progress填充的drawable

阅读更多
把任意Drawable转换成基于progress填充的drawable。 progress可以是四个方向:from_left, from_top, from_right, from_bottom。



FillDrawable的背后是PorterDuffColorFilter

// obtain a Drawable object
final Drawable drawable = getDrawable(...);
 
// initialize bounds
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
 
// create a FillDrawable
// Note, that you should call `mutate()`, otherwise changes made by FillDrawable
// will be reflected in other places where this drawable is used.
// It has to do it Android drawable cache
final FillDrawable fillDrawable = new FillDrawable(FillDrawable.FROM_LEFT, drawable.mutate())
    .setNormalColor(int color)
    .setFillColor(int color);
 
...
 
fillDrawable.setFillPercent(float percent);


此外,还提供了一个FillImageView控件来通过XML属性初始化FillDrawable:
app:fiv_normalColor="@color/normal_color"
app:fiv_fillColor="@color/fill_color"
app:fiv_drawable="@drawable/ic_launcher"
app:fiv_from="left" <!-- (left|top|right"bottom) -->
app:fiv_percent="50.0"


完整用法:
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

import ru.noties.filldrawable.FillDrawable;
import ru.noties.filldrawable.FillImageView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final List<FillDrawable> drawables = createDrawables();
        final List<ImageView> imageViews = Arrays.asList(
                (ImageView) findViewById(R.id.image_1),
                (ImageView) findViewById(R.id.image_2)
        );

        for (int i = 0, length = Math.min(drawables.size(), imageViews.size()); i < length; i++) {
            imageViews.get(i).setImageDrawable(drawables.get(i));
        }

        final FillImageView fillImageView1 = (FillImageView) findViewById(R.id.fill_image_view_1);
        final FillImageView fillImageView2 = (FillImageView) findViewById(R.id.fill_image_view_2);
        drawables.add(0, fillImageView2.getFillDrawable());
        drawables.add(0, fillImageView1.getFillDrawable());

        final Handler handler = new Handler();
        handler.post(new FakeProgress(handler, new FakeProgress.OnProgressChange() {
            @Override
            public void onProgressChange(float progress) {
                for (FillDrawable drawable: drawables) {
                    drawable.setFillPercent(progress);
                }
            }
        }));
    }

    private List<FillDrawable> createDrawables() {

        final Drawable drawable = ContextCompat.getDrawable(this, R.drawable.ic_android);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

        final int alpha = 125;

        final int rightColor = ContextCompat.getColor(this, R.color.color_3);
        final FillDrawable right = new FillDrawable(FillDrawable.FROM_RIGHT, drawable.mutate())
                .setNormalColor(ColorUtils.applyAlpha(rightColor, alpha))
                .setFillColor(rightColor);

        final int bottomColor = ContextCompat.getColor(this, R.color.color_4);
        final FillDrawable bottom = new FillDrawable(FillDrawable.FROM_BOTTOM, drawable.mutate())
                .setNormalColor(ColorUtils.applyAlpha(bottomColor, alpha))
                .setFillColor(bottomColor);

        return new ArrayList<FillDrawable>() {{
            add(right);
            add(bottom);
        }};
    }

    private static class FakeProgress implements Runnable {

        interface OnProgressChange {
            void onProgressChange(float progress);
        }

        private final Handler mHandler;
        private final Random mRandom;
        private final OnProgressChange mOnProgressChange;
        private final float mPercent = 1.F / 100;
        int runs;
        boolean isGrowing = true;

        FakeProgress(Handler handler, OnProgressChange onProgressChange) {
            mHandler = handler;
            mOnProgressChange = onProgressChange;
            mRandom = new Random();
        }

        @Override
        public void run() {

            if (isGrowing && ++runs >= 100) {
                isGrowing = false;
                runs = 100;
            } else if (!isGrowing && --runs <= 0) {
                isGrowing = true;
                runs = 0;
            }

            final int step = mRandom.nextInt(50) + 50;
            mOnProgressChange.onProgressChange(mPercent * runs);
            mHandler.postDelayed(this, step);
        }
    }
}



逐步加图片的Android控件:BlurImageView
http://www.open-open.com/lib/view/open1447423790600.html
  • 大小: 537.8 KB
分享到:
评论

相关推荐

    基于progress填充的drawable

    源码FillDrawable,把任意Drawable转换成基于progress填充的drawable。 progress可以是四个方向:from_left, from_top, from_right, from_bottom。

    用 Drawable 实现一个自定义电池图标

    在Android开发中,Drawable是用于绘制图形对象的重要类,它能帮助我们实现各种自定义的UI元素,包括图标。本教程将深入讲解如何利用Drawable来创建一个自定义的电池图标,以此来展示Drawable的灵活性和实用性。 ...

    Android:Drawable样式和尺寸单位源代码

    &lt;item android:maxLevel="50" android:drawable="@drawable/progress_medium" /&gt; &lt;item android:maxLevel="100" android:drawable="@drawable/progress_high" /&gt; ``` 在AndroidProject7这个项目中,你可能已经...

    seekabr.rar

    2. **ProgressDrawable**:进度条的填充部分,通过`@drawable/progress_drawable`指定。可以使用GradientDrawable来创建渐变效果,或者使用LayerDrawable来组合多个Drawable,实现复杂的样式。 3. **...

    从右往左的progress

    接下来,在`res/drawable`目录下创建名为`custom_progress_drawable.xml`的XML文件,用于定义自定义的进度绘制逻辑: ```xml &lt;!-- 背景颜色 --&gt; android:width="match_parent" android:height="4dp" /&gt;...

    t_java_groundsbd_progress_源码

    `progressbar_progress.xml`通常用于定义进度条的填充部分,而`progressbar_tag.xml`可能用于定义滑块或者指示器的样式,例如颜色、形状、大小等。通过修改这两个文件中的属性,开发者可以改变进度条的颜色、宽度、...

    seekbar带进度条百分百的

    上述代码中,`@drawable/custom_progress_drawable`、`@drawable/custom_indeterminate_drawable`和`@drawable/custom_thumb`分别代表进度条填充部分、不确定状态的进度条和滑块的图形资源。 5. 动态更新进度: ...

    ProgressBar自定义进度条

    通过创建一个自定义的Drawable资源文件,例如`progress_drawable.xml`,并将其设置为`progressBackground`或`progressDrawable`属性: ```xml ... android:progressDrawable="@drawable/progress_drawable" /&gt; ``...

    Android 5.0 Android L Material Design风格Progress

    为了实现更精细的控制,开发者还可以创建自定义的Drawable资源,如层叠列表(LayerDrawable)或者动画Drawable(AnimatedDrawable),并将其设置给ProgressBar的`android:progressDrawable`属性,以此实现更复杂的...

    android 自定义progressbar

    `background`项定义了进度条未填充部分的颜色,`progress`项定义了已填充部分的颜色。`corners`属性用于设置圆角半径,让进度条看起来更圆润。 三、引用自定义样式 在布局文件中,我们将刚定义的style应用到...

    自定义progressBar自带动画

    2. 自定义绘图资源:在res/drawable目录下,创建progress_drawable.xml,定义进度条的填充和未填充部分。例如,可以使用GradientDrawable来创建渐变效果: ```xml android:width="4dp" android:height="30dp" ...

    带指示器ProgressBar

    其中,`@drawable/custom_progress_drawable`是一个自定义的绘图资源,可以定义进度条的颜色、形状等。 2. 在Java或Kotlin代码中获取`ProgressBar`引用,并控制其行为: ```java ProgressBar progressBar = ...

    Android自定义水平进度条圆角进度

    在`res/drawable`目录下创建一个名为`custom_progress_bar.xml`的文件。这个文件将包含一个矩形背景和一个填充的矩形,用于显示进度。我们可以通过设置`shape`元素的`corners`属性来实现圆角效果。以下是一个基本的...

    水平进度条和默认进度条

    其中,`@drawable/circular_progress_bar`是一个自定义的形状资源,通常定义在`res/drawable`目录下: ```xml android:fromDegrees="270" android:pivotX="50%" android:pivotY="50%" android:toDegrees=...

    QQ、微信、立体感、中间展开样式进度条

    这里的`@drawable/custom_progress_bar`指的是自定义的进度条绘制资源,通常是一个Nine-Patch图片或者StateListDrawable,用于设置背景和进度部分的样式。在`custom_progress_bar.xml`中,可以定义不同状态下的图形...

    ProgressBar使用图片是圆角demo

    为了实现圆角效果,我们需要创建一个自定义的 drawable 资源文件,例如`custom_progress_drawable.xml`,放在res/drawable目录下: ```xml &lt;!-- 设置圆角 --&gt; &lt;!-- 颜色、宽度等其他属性 --&gt; android...

    进度条对话框

    android:progressDrawable="@drawable/custom_progress_drawable" /&gt; ``` 在这里,我们设置了进度条的最大值,并指定了一个自定义的绘制对象`custom_progress_drawable`。这个drawable可以在`res/drawable`目录下...

    Android ProgressBar进度条使用详解

    例如,可以创建一个`progress_bar_states.xml`文件来定义进度条的填充和未填充状态。 总的来说,Android的ProgressBar组件提供了丰富的定制能力,可以根据需求调整其样式、颜色、尺寸以及进度更新方式。无论是简单...

    android 自定义progressDialog实现

    在Android开发中,Progress Dialog是用户界面中常见的一种组件,用于在执行耗时操作时向用户提供反馈,表明应用正在后台处理事务。然而,系统默认的ProgressDialog样式可能无法满足所有设计需求,因此,开发者常常...

Global site tag (gtag.js) - Google Analytics