Diablo3英雄榜-进度条

Diablo3英雄榜-进度条

目标

  • 在发呆的时候添加一个进度条
  • 使用第三方控件
  • Fragment之间的通信
  • Handler的使用

源起

在读取魔兽英雄榜数据的时候,有时候会有很多个网络请求,但是网络的速度永远是无法预估的。这个时候有一个进度条是极好的。我们在前一篇文章中,我们读取了用户信息和用户的装备信息。在读取信息的时候使用了27个Request。这个时候应用有一点点顿。为了让顿的时候有更好的体验,我们加入了一个进度条。我添加了一个第三方控件,用于在等待。做出来的效果是这个样子的。

这个进度条是在英雄列表界面中,我点击了一个英雄之后,他开始读取这个英雄的信息,然后在根据这个英雄读取26件装备的信息。在这个过程中就会随机显示一个图腾,图腾周围有一圈绿色的进度条。因为是读取网络数据,我没有精确的定位进度,所以这个绿条走满之后会切换到下一个图腾,然后继续走进度条。

第三方控件

Android-square-progressbar

在目录中右键->Git Bash

$git clone https://github.com/mrwonderman/android-square-progressbar.git

官方地址:

https://github.com/mrwonderman/android-square-progressbar

Fragment显示进度条

Square_progressbar.xml 代码如下

<FrameLayout

android:layout_height="fill_parent"

android:layout_width="fill_parent"

android:background="#80000000"

xmlns:android="http://schemas.android.com/apk/res/android">

<net.yscs.android.square_progressbar.SquareProgressBar

xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/sprogressbar"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true"

android:paddingTop="20dp"

android:layout_gravity="center">

</net.yscs.android.square_progressbar.SquareProgressBar>

</FrameLayout>

ProgressbarFragment 的代码如下:

public class ProgressbarFragment extends Fragment {

OnHeadlineSelectedListener mCallback;

SquareProgressBar mSquareProgressBar;

public static final String ARG_POSITION =

"com.example.lijing.diablo3armory.position";

// 用来存放fragment的Activtiy必须实现这个接口

public interface OnHeadlineSelectedListener {

public void onArticleSelected(int position);

}

@Override

public void onAttach(Activity activity) {

super.onAttach(activity);

// 这是为了保证Activity容器实现了用以回调的接口。如果没有,它会抛出一个异常。

try {

mCallback = (OnHeadlineSelectedListener) activity;

} catch (ClassCastException e) {

throw new ClassCastException(activity.toString()

+ " must implement OnHeadlineSelectedListener");

}

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

// Inflate the layout for this fragment

View v = inflater.inflate(R.layout.square_progressbar, container, false);

mSquareProgressBar = (SquareProgressBar)v.findViewById(R.id.sprogressbar);

Random rm = new Random();

mSquareProgressBar.setImage(mThumbIds[rm.nextInt(mThumbIds.length)]);

int position = (int)getArguments().getInt(ARG_POSITION);

mSquareProgressBar.setProgress(position);

return v;

}

// references to our images

private Integer[] mThumbIds2 = {

R.drawable.barcrest, R.drawable.crscrest,

R.drawable.dhcrest, R.drawable.monkcrest,

R.drawable.wdcrest, R.drawable.widcrest

};

private Integer[] mThumbIds = {

R.drawable.photo1, R.drawable.photo2,

R.drawable.photo3, R.drawable.photo4

};

public void updateArticleView(int position) {

mSquareProgressBar.setProgress(position);

}

}

这个Fragment具有如下功能:

  • 随机显示一个图片
  • 根据Argument里面的数字来设置进度(这个Fragment是可以跟其他Fragmeng交互的)

如何使用

FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();

transaction.add(R.id.fragmentContainer, fragment, "progress");

transaction.commit();

在读取完后数据后,比如onResponse()里面,在跳转到其他Fragment之前执行下面的代码

Fragment fragment = getActivity().getSupportFragmentManager().findFragmentByTag("progress");

if(fragment != null)

getActivity().getSupportFragmentManager().beginTransaction().remove(fragment).commit();

这样在点击后退键的时候就不会回到进度条的Fragment里面了。现在就可以正常的显示这个图片了,但是这样做只能显示一个静态的图片。我们需要不停的改变这个控件的进度。因为这个Fragment已经具备了跟其他Fragment交互的条件。

设置进度条的进度

要想使Fragment可以与其他的Fragment可以交互,都必须通过其关联的Activity,而不会跟对方直接通信。我们需要定义一个接口,并在Activity调用该接口。Fragment在onAttach()生命周期方法中获取到接口方法,之后就可以通过调用接口中的方法与Activity进行通信了。

在ProgressbarFragment中,我们做出了如下定义

OnHeadlineSelectedListener mCallback;

……

// 用来存放fragment的Activtiy必须实现这个接口

public interface OnHeadlineSelectedListener {

public void onArticleSelected(int position);

}

…..

@Override

public void onAttach(Activity activity) {

super.onAttach(activity);

// 这是为了保证Activity容器实现了用以回调的接口。如果没有,它会抛出一个异常。

try {

mCallback = (OnHeadlineSelectedListener) activity;

} catch (ClassCastException e) {

throw new ClassCastException(activity.toString()

+ " must implement OnHeadlineSelectedListener");

}

}

然后我们就可以

public class MainActivity extends FragmentActivity

implements ProgressbarFragment.OnHeadlineSelectedListener{

….

然后在这个Activity中重写onArticleSelected()

public void onArticleSelected(int position) {

ProgressbarFragment articleFrag = (ProgressbarFragment)

getSupportFragmentManager().findFragmentById(R.id.squareProgressBar1);

if (articleFrag != null) {

articleFrag.updateArticleView(position);

} else {

ProgressbarFragment newFragment = new ProgressbarFragment();

Bundle args = new Bundle();

args.putInt(ProgressbarFragment.ARG_POSITION, position);

newFragment.setArguments(args);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

transaction.replace(R.id.fragmentContainer, newFragment);

transaction.commit();

}

}

这样之后我们可以使用onArticleSelected(0-100)来设置进度条了。

让进度条不停的动

我们需要读取27条信息当然我们可以做成在每个onResponse()里面根据读取的数量之一来设置进度。如果这样做的话还可以在图片上显示数字百分比更好看。我的做法是设置了一个时钟每次随机增加一个数字,当数字大于或等于100后自动归0。这个就涉及到一个时钟的问题。

我采用了handler,首先我先定义了3个变量和一个方法

private Handler handler = new Handler();

private boolean run = true;

private int count = 1;

。。。。。

private Runnable myRunnable= new Runnable() {

public void run() {

Random rm = new Random();

if (run) {

handler.postDelayed(this, 100);

if(count >= 100)

count=1;

else

count += rm.nextInt(50);

onArticleSelected(count);

}

}

};

这样我们就可以使用handler.post(myRunnable);来激活这个handler了。当需要让handler停止的时候,只需要将run = false就可以了。

时间: 2024-10-06 13:59:54

Diablo3英雄榜-进度条的相关文章

Diablo3 英雄榜-显示用户的装备信息-Volley读取API的图片资源,使用MySingleton管理RequestQueue

Diablo3 英雄榜-显示用户的装备信息 -Volley读取API的图片资源 本章目标: 使用一个类来管理RequestQueue 完成Diablo3英雄榜的装备界面概览界面 进一步的熟悉暴雪API 源起 在之前我们提到过使用Volley获取Json数据.参看 Diablo3英雄榜-使用Volley和Gson来处理暴雪API的Json数据 在返回的数据不是立刻返回的.返回后的事件事实上是在onResponse()中来处理.现在我们要实现多个资源同时来请求,每个请求都有自己的Request,那么

Android 从无到有打造一个炫酷的进度条效果

从无到有打造一个炫酷的进度条效果

每周进度条(第十五周)

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

Bootstrap进度条

Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet Explorer 9 及之前的版本和旧版的 Firefox 不支持该特性, Opera 12 不支持动画. 默认的进度条 创建一个基本的进度条的步骤如下: 添加一个带有 class .progress 的 <div>. 接着,在上面的 <div> 内,添加一个带有 class .progress-bar 的空的 <div>. 添加一个带有百分比表示的宽度的 style 属性,例如 sty

HTML5/CSS3超酷进度条 不同进度多种颜色

下面我们来看看实现这款进度条的过程和源码,代码主要由HTML.CSS以及jQuery组成,实现过程也相对比较简单.HTML代码: <div id="wrapper">     <div class="loader-container">           <div class="meter">0</div>           <span class="runner"&g

基于HT for Web矢量实现HTML5文件上传进度条

在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件上传进度条,矢量在<矢量Chart图表嵌入HTML5网络拓扑图的应用>一文中已经讲述了关于setCompType()方法的应用,今天我们用setImage()方法充分利用系统中定义好的矢量资源来实现文件上传进度条,我们先来看下效果图: 从效果图可以看到,向服务器上传了一个mp4文件,并在最下方显示

Android的下拉刷新带进度条效果

首先看一下运行效果图,程序的下拉刷新参考了视频,在视频页面也提供了源码下载, http://www.imooc.com/learn/135 本篇主要说在此基础上增加了进度条的快速旋转和递增递减处理,在文章最后也会给出源码,这里主要描述一下所用的一个类 RoundProgressBar package com.cayden.listview; import android.content.Context; import android.content.res.TypedArray; import

【WebView】带加载进度条的WebView及Chrome联调

先看效果图: 看到顶部蓝色的进度条了. 原理:用到了 android.webkit.WebChromeClient中的onProgressChanged,而android.webkit.WebViewClient是没有这个方法的.所以普通的WebView是无法实现进度条的. 下面直接上干货: /** * ProgressWebView * * @author lif * * */ @SuppressWarnings("deprecation") public class Progres

OpenCV GUI基本操作,回调函数,进度条,裁剪图像等

代码为转载,出处找不到了,不贴了 工具条进度条: // ConvertColor.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #pragma comment(lib,"opencv_core2410d.l