android 加载中自定义控件,Android 自定义一款炫酷的加载控件
概述:
在设计应用的时候,我们应该热爱极简主义,简单就是好的,对于很多用户来说,复杂的东西并不受欢迎。
我要实现的是根据不同的情况去显示不同的加载效果,随用随调,效果是借鉴于某一项目的效果,我认为有必要提取出来改善封装一下,供以后使用。情况大致分为:加载中、无网络、无数据、加载失败等;
预览下效果图
这里写图片描述
我们怎么实现这种效果呢
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 自定义一款炫酷的加载控件相关推荐
- 一款炫酷Loading动画--加载成功
简介 昨天在简书上看到一篇文章,介绍了一个加载动画的实现过程 一款Loading动画的实现思路(一) 只可惜原动画是IOS上制作的,而看了一下,作者的实现思路比较复杂,于是趁着空闲写了一个Androi ...
- 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 布局的创 ...
- Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸
Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸 在安卓中,将屏幕密度分为了五类 屏幕密度 对应的标签 对应的像素 120dip ldpi 1dp= 0.75px 160dip mdp ...
- Android 炫酷动画APP,21 款炫酷动画开源框架,照亮你的APP
原标题:21 款炫酷动画开源框架,照亮你的APP 2017年安卓巴士全球开发者论坛-上海站 前言 最近对应用的UI视觉效果突然来了兴致,所以找了一些合适开源控件,这样更加省时,再此分享给大家,希望能对 ...
- Android eclipse实现创建水果表并添加信息,将其以ListView控件显示
Android eclipse实现创建水果表并添加信息,将其以ListView控件显示 整个程序包含:三个.java文件以及两个.xml文件 1.Fruit.java: package com.gpn ...
- 一款炫酷Loading动画--加载失败
简介 上一篇文章一款炫酷Loading动画–加载成功,给大家介绍了成功动画的绘制过程,这篇文章将接着介绍加载失败特效的制作. 相比成功动画,有了前面的经验,失败动画的过程就显得比较简单了. 动画结构分 ...
- android 横向stepview,一款由Recyclerview打造的步骤控件,支持横向和纵向
RecyclerviewForStepView 一款由Recyclerview打造的步骤控件,支持横向和纵向 节点的图片和样式可以根据需求改动, 节点的连接线可以自定义.可以添加动画效果,点击事件等 ...
- 给DataList分页有两个办法:1、自定义实现分页方法 2、用第三方控件(例如AspNetPager)
给DataList分页有两个办法:1.自定义实现分页方法 2.用第三方控件(例如AspNetPager) 先介绍下如何自定义实现分页方法. 我的DataList分页方法的核心原理是利用PagedDat ...
- android中弹出消息字体设置,Android如何设置中粗字体——自定义textview
最近UI出了一版新的UI效果图,里面的标题用的都是中粗字体.这个中粗字体对于ios来说是很容易的,因为ios本省就自带中粗字体,但是对于安卓来说就没那么简单了,因为安卓中的textview只有标准字体 ...
- Android如何设置中粗字体——自定义textview
最近UI出了一版新的UI效果图,里面的标题用的都是中粗字体.这个中粗字体对于ios来说是很容易的,因为ios本省就自带中粗字体,但是对于安卓来说就没那么简单了,因为安卓中的textview只有标准字体 ...
最新文章
- 希尔排序算法图解分析
- EL表达式的11隐含对象
- tdms打开闪退问题
- 2021计算机技术调剂,2021年华南师范大学计算机技术考研调剂信息
- SharePoint 2010 Crawl Component Stuck in “Recovering” status
- 在WEB程序中隐藏后门
- IDC带宽测试几款软件(Multiping pingPlotter TracertGUI )
- Java设计模式--单例模式(代码详解懒汉、饿汉模式)
- .cer文件转.pem文件
- 【锐捷交换】交换机MSTP+VRRP配置
- ae计算机内存不足,解决电脑内存不足的解决方法|电脑内存不足怎么办
- FSA确定性识别算法
- SHAP:解释模型预测的通用方法
- mysql 回滚删除操作_Mysql如何快速回滚被删除的数据
- Html中img src=/图片路径的使用方式
- mac执行java死卡_MacOS应用程序有时卡死,怎么办?2种方法轻松搞定
- 浅聊WebRTC视频通话
- 恢复chrome书签
- 对学校的希望和寄语_给学校的祝福语
- PSPICE混沌电路的相图操作
热门文章
- ch8 ProviderDemo
- 记录下 如何导出安卓包
- java 多线程发送邮件_Java实现多线程邮件发送
- linux选择内核命令,Lenky个人站点
- 如何解决时间在前端显示的问题,使用jsel解决,仅供初步接触servlet新手
- c++ascii表_几道和散列(哈希)表有关的面试题
- python小爬虫,爬取文章(知乎专栏)片段
- 文件系统管理 之 Fedora Core 4.0 HAL配置即插即用移动存储(USB及1394)的实践
- 利用jira-python及selenium完成jira的统计报表及日报的填写
- UI设计师——你是什么设计师?