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

我正在尝试执行类似于我在Android中放置的旋转活动。 我相信我应该使用ProgressDialog。 我的问题来自于如何实际操作ProgressDialog,使其像活动指示符一样出现。

任何想法都欢迎。 一个例子的链接甚至会更好。

谢谢。 在这里输入图像说明

重新编辑:

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> 

Solutions Collecting From Web of "在Android中实现类似于iOS的旋转活动指示器"

这是我如何实现它

这里是代码

 @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); 

UPDATE

如果你想和自定义指标,你可以在layout.xml中做到以下几点

  1. ImageViewreplaceProgressBar
  2. 将ImageView的background设置为AnimationDrawable
  3. 你可以在onPrepareDialog启动animation

你正在寻找progressDialog我相信。 这个链接可以让你开始吧。

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); } }; 

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

它由两个文件组成:

  • LoadingIndicatorBarView
  • LoadingIndicatorView

优点

  • 以编程方式创build,没有PNG滑稽意义可扩展和清晰:D
  • 可定制的酒吧颜色和angular落半径(如果你明白我的代码)

缺点

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

声明

  • 不要怪我,如果你的项目爆炸,我把这作为免费的公共领域的代码。

你会注意到我的编码风格和结构很像我的iOS编程代码。 我以编程的方式做所有的事情,如果我可以摆脱它的话,不需要XML。

如何使用这个加载指标

将所有三个类源代码复制并粘贴到其Java文件后,您需要使用LoadingIndicatorView类,除非要自定义每个栏的颜色或圆angular,否则不需要触摸另一个类。

在Activity中创build一个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, eg 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); } } 

一旦你准备好显示它,例如在一个button点击监听器,然后你打电话给:

 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); } } 

Toolbox.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; } } 

这个工具箱类是我的便利助手类,在我的所有项目中创build圆angular形状等。

希望有所帮助:D

只要看看这个图书馆。 IOSDialog / Spinner库

这是非常容易使用和解决您的问题。 有了它,你可以很容易地创build和使用微调像IOS一样。 代码示例:

 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(); 

结果

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

结果:stadard IOS对话框