自定义Loading Dialog,图片(仿美团)、GIF图片加载两种方式
2016-05-12 13:31
513 查看
整理了一下网上的 Loading Dialog,
一个仿造美团的,还有一个是直接加载gif动态图片的。
MainActivity.java
LoadingDialog.java
GifView.java
anim->frame.xml
loading_dialog.xml
main_activity.xml
styleable.xml
项目下载
一个仿造美团的,还有一个是直接加载gif动态图片的。
MainActivity.java
import android.app.Activity; import android.os.Bundle; import android.view.View; import com.example.loading.R; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); } /** * 显示美团进度对话框 * @param v */ public void showmeidialog(View v){ LoadingDialog dialog =new LoadingDialog(this, "正在加载中",R.anim.frame, LoadingDialog.Type_IMG); dialog.show(); } public void showGifdialog(View v){ LoadingDialog dialog =new LoadingDialog(this, "",R.raw.kitty, LoadingDialog.Type_GIF); dialog.show(); } }
LoadingDialog.java
import android.app.ProgressDialog; import android.content.Context; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.example.loading.R; /** * 自定义Loading对话框 */ public class LoadingDialog extends ProgressDialog { private AnimationDrawable mAnimation; private Context mContext; // 显示的图片 private ImageView mImageView; // 提示的文字 private String mLoadingTip; private TextView mLoadingTv; private int mResid; private LinearLayout load_layout; // GIF动态图片 private GifView load_gifv; // 加载框显示类型 private String showType; public static final String Type_GIF = "GIF"; public static final String Type_IMG = "IMG"; /** * loading对话框构造方法 * * @param context * 上下文 * @param content * 提示信息 * @param resId * 资源 * @param type * loading图类型 GIF;IMG */ public LoadingDialog(Context context, String content, int resId, String type) { super(context); this.mContext = context; this.mLoadingTip = content; this.mResid = resId; this.showType = type; setCanceledOnTouchOutside(true); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.loading_dialog); initView(); initData(); } /** * 页面初始化 */ private void initView() { mLoadingTv = (TextView) findViewById(R.id.load_tetv); mImageView = (ImageView) findViewById(R.id.load_imgv); load_layout = (LinearLayout) findViewById(R.id.load_layout); load_gifv = (GifView) findViewById(R.id.load_gifv); } /** * 数据初始化 */ private void initData() { if(showType.equals(Type_GIF)){ load_gifv.setMovieResource(mResid); load_gifv.setVisibility(View.VISIBLE); load_layout.setVisibility(View.GONE); }else if(showType.equals(Type_IMG)){ load_gifv.setVisibility(View.GONE); load_layout.setVisibility(View.VISIBLE); mImageView.setBackgroundResource(mResid); // 通过ImageView对象拿到背景显示的AnimationDrawable mAnimation = (AnimationDrawable) mImageView.getBackground(); // 为了防止在onCreate方法中只显示第一帧的解决方案之一 mImageView.post(new Runnable() { @Override public void run() { mAnimation.start(); } }); mLoadingTv.setText(mLoadingTip); } } /** * 设置提示信息内容 * * @param str */ public void setContent(String str) { mLoadingTv.setText(str); } }
GifView.java
import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Movie; import android.os.Build; import android.util.AttributeSet; import android.view.View; import com.example.loading.R; /** * 加载GIF的自定义View * */ public class GifView extends View { /** * 默认为1秒 */ private static final int DEFAULT_MOVIE_DURATION = 1000; private int mMovieResourceId; private Movie mMovie; private long mMovieStart; private int mCurrentAnimationTime = 0; private float mLeft; private float mTop; private float mScale; private int mMeas f95b uredMovieWidth; private int mMeasuredMovieHeight; private boolean mVisible = true; private volatile boolean mPaused = false; public GifView(Context context) { this(context, null); } public GifView(Context context, AttributeSet attrs) { this(context, attrs, R.styleable.CustomTheme_gifViewStyle); } public GifView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setViewAttributes(context, attrs, defStyle); } @SuppressLint("NewApi") private void setViewAttributes(Context context, AttributeSet attrs, int defStyle) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { setLayerType(View.LAYER_TYPE_SOFTWARE, null); } // 从描述文件中读出gif的值,创建出Movie实例 final TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.GifView, defStyle, R.style.Widget_GifView); mMovieResourceId = array.getResourceId(R.styleable.GifView_gif, -1); mPaused = array.getBoolean(R.styleable.GifView_paused, false); array.recycle(); if (mMovieResourceId != -1) { mMovie = Movie.decodeStream(getResources().openRawResource(mMovieResourceId)); } } /** * 设置gif图资源 * * @param movieResId */ public void setMovieResource(int movieResId) { this.mMovieResourceId = movieResId; mMovie = Movie.decodeStream(getResources().openRawResource(mMovieResourceId)); requestLayout(); } public void setMovie(Movie movie) { this.mMovie = movie; requestLayout(); } public Movie getMovie() { return mMovie; } public void setMovieTime(int time) { mCurrentAnimationTime = time; invalidate(); } /** * 设置暂停 * * @param paused */ public void setPaused(boolean paused) { this.mPaused = paused; if (!paused) { mMovieStart = android.os.SystemClock.uptimeMillis() - mCurrentAnimationTime; } invalidate(); } /** * 判断gif图是否停止了 * * @return */ public boolean isPaused() { return this.mPaused; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (mMovie != null) { int movieWidth = mMovie.width(); int movieHeight = mMovie.height(); int maximumWidth = MeasureSpec.getSize(widthMeasureSpec); float scaleW = (float) movieWidth / (float) maximumWidth; mScale = 1f / scaleW; mMeasuredMovieWidth = maximumWidth; mMeasuredMovieHeight = (int) (movieHeight * mScale); setMeasuredDimension(mMeasuredMovieWidth, mMeasuredMovieHeight); } else { setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight()); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); mLeft = (getWidth() - mMeasuredMovieWidth) / 2f; mTop = (getHeight() - mMeasuredMovieHeight) / 2f; mVisible = getVisibility() == View.VISIBLE; } @Override protected void onDraw(Canvas canvas) { if (mMovie != null) { if (!mPaused) { updateAnimationTime(); drawMovieFrame(canvas); invalidateView(); } else { drawMovieFrame(canvas); } } } @SuppressLint("NewApi") private void invalidateView() { if (mVisible) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { postInvalidateOnAnimation(); } else { invalidate(); } } } private void updateAnimationTime() { long now = android.os.SystemClock.uptimeMillis(); // 如果第一帧,记录起始时间 if (mMovieStart == 0) { mMovieStart = now; } // 取出动画的时长 int dur = mMovie.duration(); if (dur == 0) { dur = DEFAULT_MOVIE_DURATION; } // 算出需要显示第几帧 mCurrentAnimationTime = (int) ((now - mMovieStart) % dur); } private void drawMovieFrame(Canvas canvas) { // 设置要显示的帧,绘制即可 mMovie.setTime(mCurrentAnimationTime); canvas.save(Canvas.MATRIX_SAVE_FLAG); canvas.scale(mScale, mScale); mMovie.draw(canvas, mLeft / mScale, mTop / mScale); canvas.restore(); } @SuppressLint("NewApi") @Override public void onScreenStateChanged(int screenState) { super.onScreenStateChanged(screenState); mVisible = screenState == SCREEN_STATE_ON; invalidateView(); } @SuppressLint("NewApi") @Override protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); mVisible = visibility == View.VISIBLE; invalidateView(); } @Override protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); mVisible = visibility == View.VISIBLE; invalidateView(); } }
anim->frame.xml
<?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/image_01" android:duration="150"/> <item android:drawable="@drawable/image_02" android:duration="150"/> </animation-list>
loading_dialog.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" > <LinearLayout android:id="@+id/load_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="visible" android:gravity="center" android:orientation="vertical" > <ImageView android:id="@+id/load_imgv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@anim/frame" android:scaleType="center" /> <TextView android:id="@+id/load_tetv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="正在加载中.." android:textSize="20sp" /> </LinearLayout> <com.example.loading.GifView android:id="@+id/load_gifv" android:layout_width="60dp" android:layout_height="40dp" android:layout_centerInParent="true" android:layout_gravity="center_horizontal" android:visibility="gone" android:enabled="false" /> </RelativeLayout>
main_activity.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_width="match_parent" android:layout_height="40dp" android:layout_gravity="center" android:onClick="showmeidialog" android:text="点击加载美团对话框" /> <Button android:layout_width="match_parent" android:layout_height="40dp" android:layout_gravity="center" android:onClick="showGifdialog" android:text="点击加载Gif动画" /> </LinearLayout>
styleable.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="GifView"> <attr name="gif" format="reference" /> <attr name="paused" format="boolean" /> </declare-styleable> <declare-styleable name="CustomTheme"> <attr name="gifViewStyle" format="reference" /> </declare-styleable> </resources>
<style name="Widget_GifView" > </style>
项目下载
相关文章推荐
- iOS-Gif图片展示N种方式(原生+第三方)
- Fresco加载app内的图片,包括gif动图
- 引导页封装
- 科大讯飞自定义弹出框的类
- CentOS6.5下实现R绘图
- codeforces 672C. Recycling Bottles
- Android 动画之AlphaAnimation应用详解
- 我经历的IT公司面试及离职感受
- 【Android开发经验】android:windowSoftInputMode属性详解
- 掌中行_网站初级搭建
- process identification
- 长按二维码,保存到手机
- Android中的自定义组件(view)
- Google protobuf安装
- 图解Tomcat类加载机制
- 11RoundedImageView
- [swift学习之十]扩展语法练习
- 微信&java 开发5 jsapi_ticket的获取
- C++第5次上机作业
- 灵感大神