概述:

在设计应用的时候,我们应该热爱极简主义,简单就是好的,对于很多用户来说,复杂的东西并不受欢迎。

我要实现的是根据不同的情况去显示不同的加载效果,随用随调,效果是借鉴于某一项目的效果,我认为有必要提取出来改善封装一下,供以后使用。情况大致分为:加载中、无网络、无数据、加载失败等;

预览下效果图

这里写图片描述

我们怎么实现这种效果呢

view_loading.xml的布局如下:

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/lin_loading"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:visibility="gone"

android:orientation="vertical">

android:id="@+id/img_loading"

android:layout_width="100dp"

android:layout_height="100dp"

android:src="@drawable/loading_animation" />

android:id="@+id/tv_loading"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="16dp"

android:layout_gravity="center_horizontal"

android:textSize="14sp" />

android:id="@+id/lin_load"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:gravity="center"

android:orientation="vertical"

android:visibility="visible"

>

android:id="@+id/iv_load"

android:layout_width="100dp"

android:layout_height="100dp"

android:src="@mipmap/ic_launcher" />

android:id="@+id/tv_load"

android:layout_width="wrap_content"

android:layout_gravity="center_horizontal"

android:layout_height="wrap_content" />

android:id="@+id/btn_load"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="8dp"

android:layout_gravity="center_horizontal"

android:textSize="14sp" />

从布局来看,我分了两个部分,一个是加载中,另外一个是带有ImagView、文字和按钮的布局,有人看到这,就会说,哇靠,这不是很简单吗?根据不同的情况去设置Visibility的值就好了啊,没错,原理就是这样。

XHLoadingView.java的代码如下:

package com.woyou.loadingdemo.widget;

import android.content.Context;

import android.graphics.drawable.AnimationDrawable;

import android.util.AttributeSet;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.Button;

import android.widget.FrameLayout;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.TextView;

import com.woyou.loadingdemo.LoadingState;

import com.woyou.loadingdemo.R;

/**

* Created by Xiho on 11:21.

*/

public class XHLoadingView extends FrameLayout {

private Context mContext;

// 加载中的布局

private LinearLayout mLinearLoad;

//其他加载的布局

private LinearLayout mLinearLoading;

private TextView mTvLoading;

private TextView mTvLoad;

private ImageView mIvLoading;

private ImageView mIvLoad;

private Button mBtnLoad;

private LoadingState mState;

private AnimationDrawable animation;

public XHLoadingView(Context context) {

super(context);

mContext = context;

}

public XHLoadingView(Context context, AttributeSet attrs) {

super(context, attrs);

mContext = context;

}

public XHLoadingView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

mContext = context;

}

public XHLoadingView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {

super(context, attrs, defStyleAttr, defStyleRes);

mContext = context;

}

public void build(){

LayoutInflater.from(mContext).inflate(R.layout.view_loading, this, true);

mLinearLoading = (LinearLayout) findViewById(R.id.lin_loading);

mLinearLoad = (LinearLayout) findViewById(R.id.lin_load);

mIvLoading = (ImageView) findViewById(R.id.img_loading);

mIvLoad = (ImageView) findViewById(R.id.iv_load);

mTvLoading = (TextView) findViewById(R.id.tv_loading);

mTvLoad = (TextView) findViewById(R.id.tv_load);

mBtnLoad = (Button) findViewById(R.id.btn_load);

mBtnLoad.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

setState(LoadingState.STATE_LOADING);

mOnRetryListener.onRetry();

}

});

}

@Override

public void setVisibility(int visibility) {

super.setVisibility(visibility);

if(View.GONE==visibility && mState==LoadingState.STATE_LOADING && animation!=null&&animation.isRunning()){

animation.stop();

}

}

/**

* 加载中提示文字

*/

private String mLoadingText;

private int mLoadingIcon;

public XHLoadingView withLoadingIcon(int resId){

mLoadingIcon = resId;

return this;

}

/**

* 加载数据为空提示文字

*/

private String mLoadEmptyText;

private int mLoadEmptyIcon;

public XHLoadingView withEmptyIcon(int resId){

mLoadEmptyIcon = resId;

return this;

}

/**

* 无网络提示

*/

private String mLoadNoNetworkText;

private int mNoNetworkIcon;

public XHLoadingView withNoNetIcon(int resId){

mNoNetworkIcon = resId;

return this;

}

private OnRetryListener mOnRetryListener;

/**

* 定义重试的的接口

*/

public interface OnRetryListener {

void onRetry();

}

public XHLoadingView withOnRetryListener(OnRetryListener mOnRetryListener){

this.mOnRetryListener = mOnRetryListener;

return this;

}

/**

* 设置加载的状态

* @param state

*/

public void setState(LoadingState state){

if(mState==state){

return;

}else if(state==LoadingState.STATE_LOADING){

mLinearLoading.setVisibility(VISIBLE);

mLinearLoad.setVisibility(GONE);

}else if(state!=LoadingState.STATE_LOADING){

mLinearLoading.setVisibility(GONE);

mLinearLoad.setVisibility(VISIBLE);

if(animation!=null && mState==LoadingState.STATE_LOADING)

animation.stop();

}

changeState(state);

}

public boolean btnEmptyEnable = true;

public boolean btnErrorEnable = true;

public boolean btnNoNetworkEnable = true;

public XHLoadingView withBtnNoNetEnnable(boolean ennable) {

btnNoNetworkEnable = ennable;

return this;

}

public XHLoadingView withBtnErrorEnnable(boolean ennable) {

btnErrorEnable = ennable;

return this;

}

public XHLoadingView withBtnEmptyEnnable(boolean ennable) {

btnEmptyEnable = ennable;

return this;

}

/**

* 改变状态

* @param state

*/

private void changeState(LoadingState state) {

switch (state) {

//加载中

case STATE_LOADING:

mState = LoadingState.STATE_LOADING;

mIvLoading.setImageResource(mLoadingIcon);

mTvLoading.setText(mLoadingText);

if (animation == null) {

animation = (AnimationDrawable) mIvLoading.getDrawable();

}

if (animation != null)

animation.start();

break;

//数据为空

case STATE_EMPTY:

mState = LoadingState.STATE_EMPTY;

mIvLoad.setImageResource(mLoadEmptyIcon);

mTvLoad.setText(mLoadEmptyText);

if (btnEmptyEnable) {

mBtnLoad.setVisibility(VISIBLE);

mBtnLoad.setText(btn_empty_text);

} else {

mBtnLoad.setVisibility(GONE);

}

break;

//加载失败

case STATE_ERROR:

mState = LoadingState.STATE_ERROR;

mIvLoad.setImageResource(mErrorIco);

mTvLoad.setText(mLoadErrorText);

if (btnErrorEnable) {

mBtnLoad.setVisibility(VISIBLE);

mBtnLoad.setText(btn_error_text);

} else {

mBtnLoad.setVisibility(GONE);

}

break;

//无网络

case STATE_NO_NET:

mState = LoadingState.STATE_NO_NET;

mIvLoad.setImageResource(mNoNetworkIcon);

mTvLoad.setText(mLoadNoNetworkText);

if (btnNoNetworkEnable) {

mBtnLoad.setVisibility(VISIBLE);

mBtnLoad.setText(btn_nonet_text);

} else {

mBtnLoad.setVisibility(GONE);

}

break;

}

}

/**

* 后台或者本地出现错误提示

*/

private String mLoadErrorText;

private int mErrorIco;

public XHLoadingView withErrorIco(int resId) {

mErrorIco = resId;

return this;

}

/**

* 加载空数据

* @param resId

* @return

*/

public XHLoadingView withLoadEmptyText(int resId) {

mLoadEmptyText = getResources().getString(resId);

return this;

}

public XHLoadingView withLoadEmptyText(String mLoadEmptyText) {

this.mLoadEmptyText = mLoadEmptyText;

return this;

}

/**

* 无网络时候加载文字

* @param resId

* @return

*/

public XHLoadingView withLoadNoNetworkText(int resId) {

mLoadNoNetworkText = getResources().getString(resId);

return this;

}

public String btn_empty_text = "重试";

public String btn_error_text = "重试";

public String btn_nonet_text = "重试";

/**

* 数据为空的Button的文字提示

* @param text

* @return

*/

public XHLoadingView withBtnEmptyText(String text) {

this.btn_empty_text = text;

return this;

}

/**

* 加载错误的Button的文字提示

* @param text

* @return

*/

public XHLoadingView withBtnErrorText(String text) {

this.btn_error_text = text;

return this;

}

/**

* 加载错误的文字提示

* @param resId

* @return

*/

public XHLoadingView withLoadErrorText(int resId) {

this.mLoadErrorText = getResources().getString(resId);

return this;

}

public XHLoadingView withLoadErrorText(String mLoadedErrorText) {

this.mLoadErrorText = mLoadedErrorText;

return this;

}

/**

* 加载无网络的Button的文字提示

* @param text

* @return

*/

public XHLoadingView withBtnNoNetText(String text) {

this.btn_nonet_text = text;

return this;

}

/**

* 加载没有网路的文字提示

* @param mLoadedNoNetText

* @return

*/

public XHLoadingView withLoadNoNetworkText(String mLoadedNoNetText) {

this.mLoadNoNetworkText = mLoadedNoNetText;

return this;

}

public XHLoadingView withLoadingText(int resId) {

this.mLoadingText = getResources().getString(resId);

return this;

}

public XHLoadingView withLoadingText(String mLoadingText) {

this.mLoadingText = mLoadingText;

return this;

}

}

针对不同的情况作了不同的处理,然后我们在需要的Activity调用。

private XHLoadingView mLoadingView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_display);

mLoadingView = (XHLoadingView) findViewById(R.id.lv_loading);

mLoadingView.withLoadEmptyText("≥﹏≤ , 啥也木有 !").withEmptyIcon(R.drawable.disk_file_no_data).withBtnEmptyEnnable(false)

.withErrorIco(R.drawable.ic_chat_empty).withLoadErrorText("(῀( ˙᷄ỏ˙᷅ )῀)ᵒᵐᵍᵎᵎᵎ,我家程序猿跑路了 !").withBtnErrorText("臭狗屎!!!")

.withLoadNoNetworkText("你挡着信号啦o( ̄ヘ ̄o)☞ᗒᗒ 你走").withNoNetIcon(R.drawable.ic_chat_empty).withBtnNoNetText("网弄好了,重试")

.withLoadingIcon(R.drawable.loading_animation).withLoadingText("加载中...").withOnRetryListener(new XHLoadingView.OnRetryListener() {

@Override

public void onRetry() {

SnackbarUtil.show(mLoadingView,"已经在努力重试了",0);

}

}).build();

}

........

//加载中

mLoadingView.setVisibility(View.VISIBLE);

mLoadingView.setState(LoadingState.STATE_LOADING);

//空数据

mLoadingView.setVisibility(View.VISIBLE);

mLoadingView.setState(LoadingState.STATE_EMPTY)

//无网络

mLoadingView.setVisibility(View.VISIBLE);

mLoadingView.setState(LoadingState.STATE_NO_NET);

//加载错误

mLoadingView.setVisibility(View.VISIBLE);

mLoadingView.setState(LoadingState.STATE_ERROR);

.......

}

源码中注释详细,就不用再做过多的解释了吧!

android 加载中自定义控件,Android 自定义一款炫酷的加载控件相关推荐

  1. 一款炫酷Loading动画--加载成功

    简介 昨天在简书上看到一篇文章,介绍了一个加载动画的实现过程 一款Loading动画的实现思路(一) 只可惜原动画是IOS上制作的,而看了一下,作者的实现思路比较复杂,于是趁着空闲写了一个Androi ...

  2. Android 开发 -- 开发第一个安卓程序、Android UI开发(布局的创建:相对布局和线性布局、控件单位:px pt dp sp、常用控件 、常见对话框、ListView)

    文章目录 1. 开发第一个Hello World程序 1.1 开发程序 1.2 认识程序中的文件 1.3 Android程序结构 1.4 安卓程序打包 2. Android UI开发 2.1 布局的创 ...

  3. Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸

    Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸 在安卓中,将屏幕密度分为了五类 屏幕密度 对应的标签 对应的像素 120dip ldpi 1dp= 0.75px 160dip mdp ...

  4. Android 炫酷动画APP,21 款炫酷动画开源框架,照亮你的APP

    原标题:21 款炫酷动画开源框架,照亮你的APP 2017年安卓巴士全球开发者论坛-上海站 前言 最近对应用的UI视觉效果突然来了兴致,所以找了一些合适开源控件,这样更加省时,再此分享给大家,希望能对 ...

  5. Android eclipse实现创建水果表并添加信息,将其以ListView控件显示

    Android eclipse实现创建水果表并添加信息,将其以ListView控件显示 整个程序包含:三个.java文件以及两个.xml文件 1.Fruit.java: package com.gpn ...

  6. 一款炫酷Loading动画--加载失败

    简介 上一篇文章一款炫酷Loading动画–加载成功,给大家介绍了成功动画的绘制过程,这篇文章将接着介绍加载失败特效的制作. 相比成功动画,有了前面的经验,失败动画的过程就显得比较简单了. 动画结构分 ...

  7. android 横向stepview,一款由Recyclerview打造的步骤控件,支持横向和纵向

    RecyclerviewForStepView 一款由Recyclerview打造的步骤控件,支持横向和纵向 节点的图片和样式可以根据需求改动, 节点的连接线可以自定义.可以添加动画效果,点击事件等 ...

  8. 给DataList分页有两个办法:1、自定义实现分页方法 2、用第三方控件(例如AspNetPager)

    给DataList分页有两个办法:1.自定义实现分页方法 2.用第三方控件(例如AspNetPager) 先介绍下如何自定义实现分页方法. 我的DataList分页方法的核心原理是利用PagedDat ...

  9. android中弹出消息字体设置,Android如何设置中粗字体——自定义textview

    最近UI出了一版新的UI效果图,里面的标题用的都是中粗字体.这个中粗字体对于ios来说是很容易的,因为ios本省就自带中粗字体,但是对于安卓来说就没那么简单了,因为安卓中的textview只有标准字体 ...

  10. Android如何设置中粗字体——自定义textview

    最近UI出了一版新的UI效果图,里面的标题用的都是中粗字体.这个中粗字体对于ios来说是很容易的,因为ios本省就自带中粗字体,但是对于安卓来说就没那么简单了,因为安卓中的textview只有标准字体 ...

最新文章

  1. 希尔排序算法图解分析
  2. EL表达式的11隐含对象
  3. tdms打开闪退问题
  4. 2021计算机技术调剂,2021年华南师范大学计算机技术考研调剂信息
  5. SharePoint 2010 Crawl Component Stuck in “Recovering” status
  6. 在WEB程序中隐藏后门
  7. IDC带宽测试几款软件(Multiping pingPlotter TracertGUI )
  8. Java设计模式--单例模式(代码详解懒汉、饿汉模式)
  9. .cer文件转.pem文件
  10. 【锐捷交换】交换机MSTP+VRRP配置
  11. ae计算机内存不足,解决电脑内存不足的解决方法|电脑内存不足怎么办
  12. FSA确定性识别算法
  13. SHAP:解释模型预测的通用方法
  14. mysql 回滚删除操作_Mysql如何快速回滚被删除的数据
  15. Html中img src=/图片路径的使用方式
  16. mac执行java死卡_MacOS应用程序有时卡死,怎么办?2种方法轻松搞定
  17. 浅聊WebRTC视频通话
  18. 恢复chrome书签
  19. 对学校的希望和寄语_给学校的祝福语
  20. PSPICE混沌电路的相图操作

热门文章

  1. ch8 ProviderDemo
  2. 记录下 如何导出安卓包
  3. java 多线程发送邮件_Java实现多线程邮件发送
  4. linux选择内核命令,Lenky个人站点
  5. 如何解决时间在前端显示的问题,使用jsel解决,仅供初步接触servlet新手
  6. c++ascii表_几道和散列(哈希)表有关的面试题
  7. python小爬虫,爬取文章(知乎专栏)片段
  8. 文件系统管理 之 Fedora Core 4.0 HAL配置即插即用移动存储(USB及1394)的实践
  9. 利用jira-python及selenium完成jira的统计报表及日报的填写
  10. UI设计师——你是什么设计师?