Android 仿美团加载界面

来源:互联网 发布:java冒泡排序经典代码 编辑:程序博客网 时间:2024/06/08 12:08

发现有些App在加载页面的时候,直接show了一个ProgressDialog,然后页面就无法进行其他操作了。然而在大部分需求中,我们加载页面的情况下,是希望用户还能进行其他操作的,比如Activity中RadioGroup+Fragment这种场景,每个RadioButton对应一个Fragment,我们希望在Fragment中数据加载的情况下,还能切换fragment,类似于美团加载页面这种效果。
惯例上图
这里写图片描述
小绿人跑步的动画,参考链接http://blog.csdn.net/u012417984/article/details/49953297
其实就是4张图片组成的一个逐帧动画,考虑到可能有人些只需要加载动画,所以我把这个动画装成了一个自定义View

import android.content.Context;import android.graphics.drawable.AnimationDrawable;import android.util.AttributeSet;import android.view.LayoutInflater;import android.widget.ImageView;import android.widget.LinearLayout;/** * Created by FC小司 on 2016/11/10. */public class MyProgressView extends LinearLayout {    private ImageView imagiv;    public MyProgressView(Context context, AttributeSet attrs) {        super(context, attrs);        init(context);    }    private void init(Context context){        LayoutInflater.from(context).inflate(R.layout.dialog_custom_progress, this);        imagiv = (ImageView)findViewById(R.id.iv_loading);    }    public void startprogress(){        ((AnimationDrawable)imagiv.getDrawable()).start();    }    public void stopprogress(){        ((AnimationDrawable)imagiv.getDrawable()).stop();    }}

loading的代码:

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"    android:oneshot="false"    >    <item android:drawable="@drawable/refresh1" android:duration="80"/>    <item android:drawable="@drawable/refresh2" android:duration="80"/>    <item android:drawable="@drawable/refresh3" android:duration="80"/>    <item android:drawable="@drawable/refresh4" android:duration="80"/></animation-list>

使用也比较简单,在xml使用这个MyProgressView ,代码中调用myprogressview.startprogress()和myprogressview.stopprogress()就可以了。

下面说的是,讲加载动画MyProgressView 封装进一个FrameLayout里,增加实际项目的可用性。嗯哼,既然加载动画都加入了,在同个位置,我们顺势也把加载失败,无数据的效果也添加进来。

import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.FrameLayout;import android.widget.TextView;/** * Created by FC小司 on 2016/11/21. * 仿美团刷新布局 */public class ProgressFrameLayout extends FrameLayout{    private  MyProgressView progressView;    private TextView noResultTv;    private TextView failTv;    private AgainRequestListener mAgainRequestListener;    public void setAgainRequestListener(AgainRequestListener listener){        mAgainRequestListener=listener;    }    public interface AgainRequestListener{        void againRequest();    }    public ProgressFrameLayout(Context context, AttributeSet attrs) {        super(context, attrs);        init(context);    }    private void init(Context context) {        LayoutInflater.from(context).inflate(R.layout.frame_refresh_layout, this);        progressView= (MyProgressView) findViewById(R.id.myprogress_frame);        noResultTv= (TextView) findViewById(R.id.tv_no_result);        failTv = (TextView) findViewById(R.id.tv_load_fail);        failTv.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                mAgainRequestListener.againRequest();            }        });    }    public void showRefresh(){//正在加载        progressView.setVisibility(View.VISIBLE);        progressView.startprogress();        noResultTv.setVisibility(View.GONE);        failTv.setVisibility(View.GONE);    }    public void stopRefresh(){//加载成功        progressView.stopprogress();        progressView.setVisibility(View.GONE);        noResultTv.setVisibility(View.GONE);        failTv.setVisibility(View.GONE);    }    public void setNoResult(){//暂无数据        progressView.stopprogress();        progressView.setVisibility(View.GONE);        noResultTv.setVisibility(View.VISIBLE);        failTv.setVisibility(View.GONE);    }    public void setLoadFail(){//加载失败        progressView.stopprogress();        progressView.setVisibility(View.GONE);        noResultTv.setVisibility(View.GONE);        failTv.setVisibility(View.VISIBLE);    }}

frame_refresh_layout.xml的代码

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    >    <refreshframelayout.com.refreshframelayoutdemo.MyProgressView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:id="@+id/myprogress_frame"        android:layout_gravity="center">    </refreshframelayout.com.refreshframelayoutdemo.MyProgressView>    <TextView        android:text="暂无数据"        android:padding="30dp"        android:id="@+id/tv_no_result"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:visibility="gone"/>    <TextView        android:text="加载失败"        android:padding="30dp"        android:id="@+id/tv_load_fail"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:visibility="gone"/></FrameLayout>

实际项目中,再根据自己的产品需求,修改相应的布局即可,因为手上没有相应的图片,我用TextView代替了加载失败,无数据的图标。代码很简单,主要是给View设置可见与否。当我们加载失败的时候,需要给“加载失败”设置一个点击事件,重新加载页面,这样,我们的一套网络请求流程就下来了。使用如上面的代码,调用ProgressFrameLayout里的相应场景代码。
PS:第一次用MarkDown编辑,希望别乱码。。。。
源码链接 http://download.csdn.net/detail/qq_31390699/9703165

0 0