在Android中实现类似于iOS的旋转活动指示器

问题描述 投票:0回答:5

我正在尝试实现类似于我在 Android 中放置的旋转活动。我相信我应该使用 ProgressDialog。我的问题源于如何实际操作 ProgressDialog 以使其看起来像活动指示器。

欢迎任何想法。一个例子的链接就更好了。

谢谢。 enter image description here

重新编辑:

myProgress.java

public class myProgress extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ProgressDialog d = (ProgressDialog)findViewById(R.id.progres);

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/progres"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
>
<ProgressBar  
    android:id="@+id/progressBar"
    android:indeterminate="true" 
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true" 
/>
</RelativeLayout>
android animation progress-bar rotation android-progressbar
5个回答
8
投票

我编写了自己的自定义 LoadingIndicatorView。

它由两个文件组成:

  • 正在加载IndicatorBarView
  • 加载指示器视图

优点

  • 以编程方式创建,没有 PNG 滑稽动作,意味着可扩展且清晰:D
  • 可定制的条形颜色和角半径(如果你理解我的代码)

缺点

  • 不如 iOS 版本(我只是一个来自 iOS 背景的初学者 Android 开发者,你期望什么?):P

免责声明

  • 如果你的项目失败了,请不要怪我,我会将其作为免费的公共领域代码。

你会注意到我的编码风格和结构与我的 iOS 编程代码非常相似。我以编程方式完成所有操作,如果可以的话,就不用 XML。

如何使用此加载指示器

将所有三个类源代码复制并粘贴到其 Java 文件中后,如果您想使用

LoadingIndicatorView
类,则不需要接触其他类,除非您想自定义其颜色或圆角每个酒吧。

在您的 Activity 中创建一个

LoadingIndicatorView
的实例:

import com.companyName.myApplication.views.LoadingIndicatorView;

public class MyActivity extends AppCompatActivity
{
    public mainLayout RelativeLayout;
    ...
    public LoadingIndicatorView loadingIndicator;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        initViews();
        initLayouts();
        addViews();
    }

    public void initViews()
    {
        mainLayout = new RelativeLayout(this);
        mainLayout.setBackgroundColor(Color.BLACK);

        ...

        // ---------------------------------------------------
        // 40 here is the radius of the circle
        // try and use multiples of 2, e.g. 40, 60, 80 etc
        // ---------------------------------------------------
        loadingIndicator = new LoadingIndicatorView(this, 40);

        // hide until ready to start animating
        loadingIndicator.setAlpha(0.0f);
    }

    public void initLayouts()
    {
        ...

        // Need API level 17 for this, set in your AndroidManifeset.xml
        mainLayout.setId(View.generateViewId());
        loadingIndicator.setId(View.generateViewId());

        RelativeLayout.LayoutParams loadingIndicatorLayoutParams = new RelativeLayout.LayoutParams(
                (int)(loadingIndicator.radius * 2.0f),
                (int)(loadingIndicator.radius * 2.0f)
        );

        loadingIndicatorLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);

        loadingIndicator.setLayoutParams(loadingIndicatorLayoutParams);
    }

    public void addViews()
    {
        ...

        mainLayout.addView(loadingIndicator);

        setContentView(mainLayout);
    }
}

一旦您准备好展示它,例如在按钮单击侦听器中,然后调用:

loadingIndicator.startAnimating();

当您想停止并隐藏指示器时,请拨打:

loadingIndicator.stopAnimating();

你最终会得到这样的结果:

LoadingIndicatorView.java

package com.companyName.myApplication.views;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.PorterDuff;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.view.animation.RotateAnimation;
import android.widget.RelativeLayout;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by Zhang on 11/02/16.
 */
public class LoadingIndicatorView extends RelativeLayout
{
    private Context context;

    private int numberOfBars;

    public ArrayList<LoadingIndicatorBarView> arrBars;

    public float radius;

    private boolean isAnimating;
    private int currentFrame;

    private final Handler handler = new Handler();
    private Runnable playFrameRunnable;

    public LoadingIndicatorView(Context context, float radius)
    {
        super(context);

        this.context = context;
        this.radius = radius;
        this.numberOfBars = 12;

        initViews();
        initLayouts();
        addViews();
        spreadBars();
    }

    public void initViews()
    {
        arrBars = new ArrayList<LoadingIndicatorBarView>();

        for(int i = 0; i < numberOfBars; i++)
        {
            LoadingIndicatorBarView bar = new LoadingIndicatorBarView(context, radius / 10.0f);

            arrBars.add(bar);
        }
    }

    public void initLayouts()
    {
        for(int i = 0; i < numberOfBars; i++)
        {
            LoadingIndicatorBarView bar = arrBars.get(i);

            bar.setId(View.generateViewId());

            RelativeLayout.LayoutParams barLayoutParams = new RelativeLayout.LayoutParams(
                    (int)(radius / 5.0f),
                    (int)(radius / 2.0f)
            );

            barLayoutParams.addRule(ALIGN_PARENT_TOP);
            barLayoutParams.addRule(CENTER_HORIZONTAL);

            bar.setLayoutParams(barLayoutParams);
        }
    }

    public void addViews()
    {
        for(int i = 0; i < numberOfBars; i++)
        {
            LoadingIndicatorBarView bar = arrBars.get(i);

            addView(bar);
        }
    }

    public void spreadBars()
    {
        int degrees = 0;

        for(int i = 0; i < arrBars.size(); i++)
        {
            LoadingIndicatorBarView bar = arrBars.get(i);

            rotateBar(bar, degrees);

            degrees += 30;
        }
    }

    private void rotateBar(LoadingIndicatorBarView bar, float degrees)
    {
        RotateAnimation animation = new RotateAnimation(0, degrees, radius / 10.0f, radius);
        animation.setDuration(0);
        animation.setFillAfter(true);

        bar.setAnimation(animation);
        animation.start();
    }

    public void startAnimating()
    {
        setAlpha(1.0f);

        isAnimating = true;

        playFrameRunnable = new Runnable()
        {
            @Override
            public void run()
            {
                playFrame();
            }
        };

        // recursive function until isAnimating is false
        playFrame();
    }

    public void stopAnimating()
    {
        isAnimating = false;

        setAlpha(0.0f);

        invalidate();

        playFrameRunnable = null;
    }

    private void playFrame()
    {
        if(isAnimating)
        {
            resetAllBarAlpha();
            updateFrame();

            handler.postDelayed(playFrameRunnable, 0);
        }
    }

    private void updateFrame()
    {
        if (isAnimating)
        {
            showFrame(currentFrame);
            currentFrame += 1;

            if (currentFrame > 11)
            {
                currentFrame = 0;
            }
        }
    }

    private void resetAllBarAlpha()
    {
        LoadingIndicatorBarView bar = null;

        for (int i = 0; i < arrBars.size(); i++)
        {
            bar = arrBars.get(i);

            bar.setAlpha(0.5f);
        }
    }

    private void showFrame(int frameNumber)
    {
        int[] indexes = getFrameIndexesForFrameNumber(frameNumber);

        gradientColorBarSets(indexes);
    }

    private int[] getFrameIndexesForFrameNumber(int frameNumber)
    {
        if(frameNumber == 0)
        {
            return indexesFromNumbers(0, 11, 10, 9);
        }
        else if(frameNumber == 1)
        {
            return indexesFromNumbers(1, 0, 11, 10);
        }
        else if(frameNumber == 2)
        {
            return indexesFromNumbers(2, 1, 0, 11);
        }
        else if(frameNumber == 3)
        {
            return indexesFromNumbers(3, 2, 1, 0);
        }
        else if(frameNumber == 4)
        {
            return indexesFromNumbers(4, 3, 2, 1);
        }
        else if(frameNumber == 5)
        {
            return indexesFromNumbers(5, 4, 3, 2);
        }
        else if(frameNumber == 6)
        {
            return indexesFromNumbers(6, 5, 4, 3);
        }
        else if(frameNumber == 7)
        {
            return indexesFromNumbers(7, 6, 5, 4);
        }
        else if(frameNumber == 8)
        {
            return indexesFromNumbers(8, 7, 6, 5);
        }
        else if(frameNumber == 9)
        {
            return indexesFromNumbers(9, 8, 7, 6);
        }
        else if(frameNumber == 10)
        {
            return indexesFromNumbers(10, 9, 8, 7);
        }
        else
        {
            return indexesFromNumbers(11, 10, 9, 8);
        }
    }

    private int[] indexesFromNumbers(int i1, int i2, int i3, int i4)
    {
        int[] indexes = {i1, i2, i3, i4};
        return indexes;
    }

    private void gradientColorBarSets(int[] indexes)
    {
        float alpha = 1.0f;

        LoadingIndicatorBarView barView = null;

        for(int i = 0; i < indexes.length; i++)
        {
            int barIndex = indexes[i];

            barView = arrBars.get(barIndex);


            barView.setAlpha(alpha);
            alpha -= 0.125f;
        }

        invalidate();
    }
}

LoadingIndicatorBarView.java

package com.companyName.myApplication.views;

import android.content.Context;
import android.graphics.Color;
import android.widget.RelativeLayout;

import com.companyName.myApplication.helper_classes.ToolBox;

/**
 * Created by Zhang on 11/02/16.
 */
public class LoadingIndicatorBarView extends RelativeLayout
{
    private Context context;
    private float cornerRadius;

    public LoadingIndicatorBarView(Context context, float cornerRadius)
    {
        super(context);

        this.context = context;
        this.cornerRadius = cornerRadius;

        initViews();
    }

    public void initViews()
    {
        setBackground(ToolBox.roundedCornerRectWithColor(
                Color.argb(255, 255, 255, 255), cornerRadius));

        setAlpha(0.5f);
    }

    public void resetColor()
    {
        setBackground(ToolBox.roundedCornerRectWithColor(
                Color.argb(255, 255, 255, 255), cornerRadius));

        setAlpha(0.5f);
    }
}

工具箱.java

package com.companyName.myApplication.helper_classes;

import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Paint;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RoundRectShape;

/**
 * Created by Zhang on 3/02/16.
 */
public class ToolBox
{
    private static ToolBox instance;
    public Context context;

    private ToolBox()
    {

    }

    public synchronized static ToolBox getInstance()
    {
        if(instance == null)
        {
            instance = new ToolBox();
        }

        return instance;
    }

    public static ShapeDrawable roundedCornerRectOutlineWithColor(int color, float cornerRadius,
                                                                  float strokeWidth)
    {
        float[] radii = new float[] {
                cornerRadius, cornerRadius,
                cornerRadius, cornerRadius,
                cornerRadius, cornerRadius,
                cornerRadius, cornerRadius
        };

        RoundRectShape roundedCornerShape = new RoundRectShape(radii, null, null);

        ShapeDrawable shape = new ShapeDrawable();
        shape.getPaint().setColor(color);
        shape.setShape(roundedCornerShape);
        shape.getPaint().setStrokeWidth(strokeWidth);
        shape.getPaint().setStyle(Paint.Style.STROKE);

        return shape;
    }

    public static ShapeDrawable roundedCornerRectWithColor(int color, float cornerRadius)
    {
        float[] radii = new float[] {
                cornerRadius, cornerRadius,
                cornerRadius, cornerRadius,
                cornerRadius, cornerRadius,
                cornerRadius, cornerRadius
        };

        RoundRectShape roundedCornerShape = new RoundRectShape(radii, null, null);

        ShapeDrawable shape = new ShapeDrawable();
        shape.getPaint().setColor(color);
        shape.setShape(roundedCornerShape);

        return shape;
    }

    public static ShapeDrawable roundedCornerRectWithColor(int color, float topLeftRadius, float
            topRightRadius, float bottomRightRadius, float bottomLeftRadius)
    {
        float[] radii = new float[] {
                topLeftRadius, topLeftRadius,
                topRightRadius, topRightRadius,
                bottomRightRadius, bottomRightRadius,
                bottomLeftRadius, bottomLeftRadius
        };

        RoundRectShape roundedCornerShape = new RoundRectShape(radii, null, null);

        ShapeDrawable shape = new ShapeDrawable();
        shape.getPaint().setColor(color);
        shape.setShape(roundedCornerShape);

        return shape;
    }

    public static int getScreenWidth()
    {
        return Resources.getSystem().getDisplayMetrics().widthPixels;
    }

    public static int getScreenHeight()
    {
        return Resources.getSystem().getDisplayMetrics().heightPixels;
    }

    public static int getScreenOrientation(Context context)
    {
        return context.getResources().getConfiguration().orientation;
    }

    public static boolean isLandscapeOrientation(Context context)
    {
        return getScreenOrientation(context) == Configuration.ORIENTATION_LANDSCAPE;
    }

}

这个工具箱类是我的方便助手类,用于在我的所有项目中创建圆角形状等。

希望有帮助:D


7
投票

这就是我实现它的方法

这是代码

@Override   
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOG_LOADING:
        final Dialog dialog = new Dialog(this, android.R.style.Theme_Translucent);          
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.loading);
        dialog.setCancelable(true);
        dialog.setOnCancelListener(new OnCancelListener() {             
            @Override
            public void onCancel(DialogInterface dialog) {
                //onBackPressed();
            }
        });
    return dialog;  

    default:
        return null;
    }
};

这里是loading.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/progres"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
>
<ProgressBar  
    android:indeterminate="true" 
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true" 
/> 
</RelativeLayout>

调用对话框
showDialog(DIALOG_LOADING);

使用

隐藏它
dismissDialog(DIALOG_LOADING);

更新

如果您想要自定义指示器,您可以在 layout.xml 中执行以下操作。

  1. ProgressBar
    替换为
    ImageView
  2. 将 ImageView 的
    background
    设置为 AnimationDrawable
  3. 您可以在
    onPrepareDialog
  4. 中启动动画

2
投票

我相信您正在寻找进步对话。您可以通过此链接开始设置。

http://www.helloandroid.com/tutorials/using-threads-and-progressdialog

 pd = ProgressDialog.show(this, "Working..", "Calculating Pi", true,
                                false);
private Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                        pd.dismiss();
                        tv.setText(pi_string);

                }
        };

2
投票

看看这个图书馆就知道了。 IOSDialog/Spinner 库

它非常易于使用并解决您的问题。有了它,您可以像在 IOS 中一样轻松创建和使用 Spinner。 代码示例:

final IOSDialog dialog1 = new IOSDialog.Builder(IOSDialogActivity.this)
            .setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    dialog0.show();
                }
            })
            .setDimAmount(3)
            .setSpinnerColorRes(R.color.colorGreen)
            .setMessageColorRes(R.color.colorAccent)
            .setTitle(R.string.standard_title)
            .setTitleColorRes(R.color.colorPrimary)
            .setMessageContent("My message")
            .setCancelable(true)
            .setMessageContentGravity(Gravity.END)
            .build();

Result

 final IOSDialog dialog0 = new IOSDialog.Builder(IOSDialogActivity.this)
            .setTitle("Default IOS bar")
            .setTitleColorRes(R.color.gray)
            .build();

结果:标准 IOS 对话框


0
投票

谢谢@zhang提供的解决方案!就我而言,根据我的项目要求,我有不同的动画(没有背景恒定的不透明度): 在这里查看第一个动画

另外,我有不同的颜色、半径,希望动画自动启动并从 xml 修改颜色、半径。为了实现这一点,我修改了

LoadingIndicatorView.java
LoadingIndicatorBarView.java
并在
attrs.xml
中添加了样式,
Toolbox.java
未修改(见下文)。

使用示例:

  <utils.ioslikespinner.LoadingIndicatorView
            android:layout_width="100dp"
            android:layout_height="100dp"
            app:color="?colorPrimary"
            app:radius="50dp"/>

如果你有类似的需求,那么这是我的代码:

LoadingIndicatorView.java

package utils.ioslikespinner;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.RotateAnimation;
import android.widget.RelativeLayout;

import com.milence.R;

import java.util.ArrayList;

/**
 * Created by Zhang on 11/02/16 (https://stackoverflow.com/a/35336605/7867180)
 * Modified for design
 *
 * @noinspection ALL
 */
public class LoadingIndicatorView extends RelativeLayout {
    private final Handler handler = new Handler();
    public ArrayList<LoadingIndicatorBarView> arrBars;
    public float radius;
    private Context context;
    private int numberOfBars;

    private int color;
    private boolean isAnimating;
    private int currentFrame;
    private Runnable playFrameRunnable;

    public LoadingIndicatorView(Context context, AttributeSet attrs) {
        super(context, attrs);

        if (attrs != null) {
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.LoadingIndicatorView);

            this.color = typedArray.getColor(R.styleable.LoadingIndicatorView_color, Color.WHITE);
            this.radius = typedArray.getDimension(R.styleable.LoadingIndicatorView_radius, 33);
        }

        this.context = context;
        this.numberOfBars = 12;

        initViews();
        initLayouts();
        addViews();
        spreadBars();

        startAnimating();
    }

    public void initViews() {
        arrBars = new ArrayList<LoadingIndicatorBarView>();

        for (int i = 0; i < numberOfBars; i++) {
            LoadingIndicatorBarView bar = new LoadingIndicatorBarView(context, 100, this.color);

            arrBars.add(bar);
        }
    }

    public void initLayouts() {
        for (int i = 0; i < numberOfBars; i++) {
            LoadingIndicatorBarView bar = arrBars.get(i);

            bar.setId(View.generateViewId());

            RelativeLayout.LayoutParams barLayoutParams = new RelativeLayout.LayoutParams(
                    (int) (radius / 5.0f),
                    (int) (radius / 2.0f)
            );

            barLayoutParams.addRule(ALIGN_PARENT_TOP);
            barLayoutParams.addRule(CENTER_HORIZONTAL);

            bar.setLayoutParams(barLayoutParams);
        }
    }

    public void addViews() {
        for (int i = 0; i < numberOfBars; i++) {
            LoadingIndicatorBarView bar = arrBars.get(i);

            addView(bar);
        }
    }

    public void spreadBars() {
        int degrees = 0;

        for (int i = 0; i < arrBars.size(); i++) {
            LoadingIndicatorBarView bar = arrBars.get(i);

            rotateBar(bar, degrees);

            degrees += 30;
        }
    }

    private void rotateBar(LoadingIndicatorBarView bar, float degrees) {
        RotateAnimation animation = new RotateAnimation(0, degrees, radius / 10.0f, radius);
        animation.setDuration(0);
        animation.setFillAfter(true);

        bar.setAnimation(animation);
        animation.start();
    }

    public void startAnimating() {
        setAlpha(1.0f);

        isAnimating = true;

        playFrameRunnable = new Runnable() {
            @Override
            public void run() {
                playFrame();
            }
        };

        // recursive function until isAnimating is false
        playFrame();
    }

    public void stopAnimating() {
        isAnimating = false;

        setAlpha(0.0f);

        invalidate();

        playFrameRunnable = null;
    }

    private void playFrame() {
        if (isAnimating) {
            resetAllBarAlpha();
            updateFrame();

            handler.postDelayed(playFrameRunnable, 100);
        }
    }

    private void updateFrame() {
        if (isAnimating) {
            showFrame(currentFrame);
            currentFrame += 1;

            if (currentFrame > 11) {
                currentFrame = 0;
            }
        }
    }

    private void resetAllBarAlpha() {
        LoadingIndicatorBarView bar = null;

        float alpha = 1f;


        for (int i = 0; i < arrBars.size(); i++) {
            bar = arrBars.get(i);

            bar.setAlpha(alpha);
        }
    }

    private void showFrame(int frameNumber) {
        int[] indexes = getFrameIndexesForFrameNumber(frameNumber);

        gradientColorBarSets(indexes);
    }

    private int[] getFrameIndexesForFrameNumber(int frameNumber) {
        if (frameNumber == 0) {
            return indexesFromNumbers(0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
        } else if (frameNumber == 1) {
            return indexesFromNumbers(1, 0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2);
        } else if (frameNumber == 2) {
            return indexesFromNumbers(2, 1, 0, 11, 10, 9, 8, 7, 6, 5, 4, 3);
        } else if (frameNumber == 3) {
            return indexesFromNumbers(3, 2, 1, 0, 11, 10, 9, 8, 7, 6, 5, 4);
        } else if (frameNumber == 4) {
            return indexesFromNumbers(4, 3, 2, 1, 0, 11, 10, 9, 8, 7, 6, 5);
        } else if (frameNumber == 5) {
            return indexesFromNumbers(5, 4, 3, 2, 1, 0, 11, 10, 9, 8, 7, 6);
        } else if (frameNumber == 6) {
            return indexesFromNumbers(6, 5, 4, 3, 2, 1, 0, 11, 10, 9, 8, 7);
        } else if (frameNumber == 7) {
            return indexesFromNumbers(7, 6, 5, 4, 3, 2, 1, 0, 11, 10, 9, 8);
        } else if (frameNumber == 8) {
            return indexesFromNumbers(8, 7, 6, 5, 4, 3, 2, 1, 0, 11, 10, 9);
        } else if (frameNumber == 9) {
            return indexesFromNumbers(9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 11, 10);
        } else if (frameNumber == 10) {
            return indexesFromNumbers(10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 11);
        } else {
            return indexesFromNumbers(11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
        }
    }

    private int[] indexesFromNumbers(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9, int i10, int i11, int i12) {
        int[] indexes = {i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12};
        return indexes;
    }

    private void gradientColorBarSets(int[] indexes) {
        float alpha = 1.0f;

        LoadingIndicatorBarView barView = null;

        for (int i = 0; i < indexes.length; i++) {
            int barIndex = indexes[i];

            barView = arrBars.get(barIndex);


            barView.setAlpha(alpha);
            alpha -= 0.088f;
        }

        invalidate();
    }
}

LoadingIndicatorBarView.java

package utils.ioslikespinner;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.widget.RelativeLayout;


/**
 * Created by Zhang on 11/02/16 (https://stackoverflow.com/a/35336605/7867180)
 * Modified for design
 *
 * @noinspection ALL
 */
@SuppressLint("ALL")
public class LoadingIndicatorBarView extends RelativeLayout {
    private Context context;
    private float cornerRadius;
    private int color;

    public LoadingIndicatorBarView(Context context, float cornerRadius, int color) {
        super(context);

        this.context = context;
        this.cornerRadius = cornerRadius;
        this.color = color;

        initViews();
    }

    public void initViews() {
        setBackground(ToolBox.roundedCornerRectWithColor(color, cornerRadius));

        setAlpha(0.5f);
    }

    public void resetColor() {
        setBackground(ToolBox.roundedCornerRectWithColor(
                Color.argb(255, 255, 255, 255), cornerRadius));

        setAlpha(0.5f);
    }
}

工具箱.java

package utils.ioslikespinner;

import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Paint;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RoundRectShape;

/**
 * Created by Zhang on 11/02/16 (https://stackoverflow.com/a/35336605/7867180)
 */
public class ToolBox {
    private static ToolBox instance;
    public Context context;

    private ToolBox() {

    }

    public synchronized static ToolBox getInstance() {
        if (instance == null) {
            instance = new ToolBox();
        }

        return instance;
    }

    public static ShapeDrawable roundedCornerRectOutlineWithColor(int color, float cornerRadius,
                                                                  float strokeWidth) {
        float[] radii = new float[]{
                cornerRadius, cornerRadius,
                cornerRadius, cornerRadius,
                cornerRadius, cornerRadius,
                cornerRadius, cornerRadius
        };

        RoundRectShape roundedCornerShape = new RoundRectShape(radii, null, null);

        ShapeDrawable shape = new ShapeDrawable();
        shape.getPaint().setColor(color);
        shape.setShape(roundedCornerShape);
        shape.getPaint().setStrokeWidth(strokeWidth);
        shape.getPaint().setStyle(Paint.Style.STROKE);

        return shape;
    }

    public static ShapeDrawable roundedCornerRectWithColor(int color, float cornerRadius) {
        float[] radii = new float[]{
                cornerRadius, cornerRadius,
                cornerRadius, cornerRadius,
                cornerRadius, cornerRadius,
                cornerRadius, cornerRadius
        };

        RoundRectShape roundedCornerShape = new RoundRectShape(radii, null, null);

        ShapeDrawable shape = new ShapeDrawable();
        shape.getPaint().setColor(color);
        shape.setShape(roundedCornerShape);

        return shape;
    }

    public static ShapeDrawable roundedCornerRectWithColor(int color, float topLeftRadius, float
            topRightRadius, float bottomRightRadius, float bottomLeftRadius) {
        float[] radii = new float[]{
                topLeftRadius, topLeftRadius,
                topRightRadius, topRightRadius,
                bottomRightRadius, bottomRightRadius,
                bottomLeftRadius, bottomLeftRadius
        };

        RoundRectShape roundedCornerShape = new RoundRectShape(radii, null, null);

        ShapeDrawable shape = new ShapeDrawable();
        shape.getPaint().setColor(color);
        shape.setShape(roundedCornerShape);

        return shape;
    }

    public static int getScreenWidth() {
        return Resources.getSystem().getDisplayMetrics().widthPixels;
    }

    public static int getScreenHeight() {
        return Resources.getSystem().getDisplayMetrics().heightPixels;
    }

    public static int getScreenOrientation(Context context) {
        return context.getResources().getConfiguration().orientation;
    }

    public static boolean isLandscapeOrientation(Context context) {
        return getScreenOrientation(context) == Configuration.ORIENTATION_LANDSCAPE;
    }

}

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<!--  ....  -->
<resources>
    <declare-styleable name="LoadingIndicatorView">
        <attr name="color" format="color" />
        <attr name="radius" format="dimension" />
    </declare-styleable>
</resources>
© www.soinside.com 2019 - 2024. All rights reserved.