热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一款超酷的Android自定义加载控件

这篇文章主要为大家详细介绍了一款超酷的Android自定义加载控件,具有一定的实用性和参考价值,感兴趣的朋友可以参考一下

在设计应用的时候,我们应该热爱极简主义,简单就是好的,对于很多用户来说,复杂的东西并不受欢迎。
我要实现的是根据不同的情况去显示不同的加载效果,随用随调,效果是借鉴于某一项目的效果,我认为有必要提取出来改善封装一下,供以后使用。情况大致分为:加载中、无网络、无数据、加载失败等,这些仅仅就需要一个View 就可以搞定啦!

预览下效果图:

我们怎么实现这种效果呢
view_loading.xml的布局如下:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

从布局来看,我分了两个部分,一个是加载中,另外一个是带有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("(&#8128;( ˙&#7620;&#7887;˙&#7621; )&#8128;)&#7506;&#7504;&#7501;&#7502;&#7502;&#7502;,我家程序猿跑路了 !").withBtnErrorText("臭狗屎!!!")
     .withLoadNoNetworkText("你挡着信号啦o( ̄ヘ ̄o)&#9758;&#5586;&#5586; 你走").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);

.......


 }

上面我是为了展示不同的效果,所以写了几个点击事件呢,实际中不是这样的,初始化过后,在需要的地方调用OK, 源码中注释详细,就不用再做过多的解释了吧!

完整代码:XHLoadingView

作者:xuhao
QQ:504105930
转载请注明出处:http://blog.csdn.net/u011974987/article/details/51455333

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。


推荐阅读
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Echarts图表重复加载、axis重复多次请求问题解决记录
    文章目录1.需求描述2.问题描述正常状态:问题状态:3.解决方法1.需求描述使用Echats实现了一个中国地图:通过选择查询周期&#x ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
author-avatar
vivi_康冬薇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有