• 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就可以了。

  • 相关阅读:
    利用javascript的prototype来实现stirng类的扩展并实现string的insert方法
    利用笔记本共享WIFI热点及利用Android手机共享WIFI热点
    语言模型发展综述
    基于阻变存储器阵列的低功耗神经网络存算一体结构研究进展综述
    2021年度总结
    【20220102】连岳摘抄
    【20220103】攻城计
    【20220104】人生很长
    【20220106】带孩子看牙医
    【20220110】怀孕不是一个人的事情
  • 原文地址:https://www.cnblogs.com/canglin/p/4439666.html
Copyright © 2020-2023  润新知