fresco自定义进度条ProgressBarImage
2016-01-26 14:45
465 查看
第一种:继承drawable
主要是重写onLevelChange,然后在里面调用invalidateSelf(),而调用invalidateSelf()时,会重绘,调用draw(Canvas canvas)
但是这种方式要自己通过Canvas自己画,有一定的复杂和难度。那就在想是否可以通过一张美工提供的loading图片实现呢?
第二种:使用AnimationDrawable
R.drawable.loading是一个xml文件,一般情况下使用AnimationDrawable 需要很多帧图片构成加载动画,这里使用一张图片即可搞定。
loading.xml
得到AnimationDrawable 之后只要设置给GenericDraweeHierarchy,然后将其配置给SimpleDraweeView就好了
public class ImageLoadingDrawable extends Drawable{ private Paint mRingBackgroundPaint; private int mRingBackgroundColor; // 画圆环的画笔 private Paint mRingPaint; // 圆环颜色 private int mRingColor; // 半径 private float mRadius; // 圆环半径 private float mRingRadius; // 圆环宽度 private float mStrokeWidth; // 圆心x坐标 private int mXCenter; // 圆心y坐标 private int mYCenter; // 总进度 private int mTotalProgress = 10000; // 当前进度 private int mProgress; public ImageLoadingDrawable(){ initAttrs(); } private void initAttrs() { mRadius = 16; mStrokeWidth = 4; mRingBackgroundColor = 0xFFadadad; mRingColor = 0xFF0EB6D2; mRingRadius = mRadius + mStrokeWidth / 2; initVariable(); } private void initVariable() { mRingBackgroundPaint = new Paint(); mRingBackgroundPaint.setAntiAlias(true); mRingBackgroundPaint.setColor(mRingBackgroundColor); mRingBackgroundPaint.setStyle(Paint.Style.STROKE); mRingBackgroundPaint.setStrokeWidth(mStrokeWidth); mRingPaint = new Paint(); mRingPaint.setAntiAlias(true); mRingPaint.setColor(mRingColor); mRingPaint.setStyle(Paint.Style.STROKE); mRingPaint.setStrokeWidth(mStrokeWidth); } @Override public void draw(Canvas canvas) { drawBar(canvas,mTotalProgress,mRingBackgroundPaint); drawBar(canvas,mProgress,mRingPaint); } private void drawBar(Canvas canvas, int level, Paint paint) { if (level > 0 ) { Rect bound= getBounds(); mXCenter = bound.centerX(); mYCenter = bound.centerY(); RectF oval = new RectF(); oval.left = (mXCenter - mRingRadius); oval.top = (mYCenter - mRingRadius); oval.right = mRingRadius * 2 + (mXCenter - mRingRadius); oval.bottom = mRingRadius * 2 + (mYCenter - mRingRadius); canvas.drawArc(oval, -90, ((float) level / mTotalProgress) * 360, false, paint); // } } @Override protected boolean onLevelChange(int level) { mProgress = level; if(level > 0 && level < 10000) { invalidateSelf(); return true; }else { return false; } } @Override public void setAlpha(int alpha) { mRingPaint.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter cf) { mRingPaint.setColorFilter(cf); } @Override public int getOpacity() { return DrawableUtils.getOpacityFromColor(this.mRingPaint.getColor()); } }
主要是重写onLevelChange,然后在里面调用invalidateSelf(),而调用invalidateSelf()时,会重绘,调用draw(Canvas canvas)
但是这种方式要自己通过Canvas自己画,有一定的复杂和难度。那就在想是否可以通过一张美工提供的loading图片实现呢?
第二种:使用AnimationDrawable
AnimationDrawable animationDrawable = new AnimationDrawable(); Drawable drawable = mActivity.getResources().getDrawable(R.drawable.loading); if(drawable != null){ animationDrawable.addFrame(drawable,200); animationDrawable.setOneShot(false); } GenericDraweeHierarchyBuilder hierarchyBuilder = new GenericDraweeHierarchyBuilder(mActivity.getResources()); hierarchyBuilder .setProgressBarImage(animationDrawable) .setActualImageScaleType(ScalingUtils.ScaleType.CENTER_INSIDE) .setFailureImage(mActivity.getResources().getDrawable(R.drawable.empty_photo)); photoView.setHierarchy(hierarchyBuilder.build());
R.drawable.loading是一个xml文件,一般情况下使用AnimationDrawable 需要很多帧图片构成加载动画,这里使用一张图片即可搞定。
loading.xml
<?xml version="1.0" encoding="utf-8"?> <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/spinner_76_inner" android:pivotX="50%" android:pivotY="50%" />
得到AnimationDrawable 之后只要设置给GenericDraweeHierarchy,然后将其配置给SimpleDraweeView就好了
相关文章推荐
- Android中自定义进度条详解
- Fresco学习初步
- Fresco使用总结
- Google Fresco 的使用解决各种问题
- java.lang.UnsatisfiedLinkError: Couldn't load memchunk from loader dalvik.system.PathClassLoader
- Fresco原理分析
- Fresco 简单操作
- Facebook新开源框架Fresco(转载)
- 自定义 进度条 样式
- Android Fresco图片处理库用法API英文原文文档1(Facebook开源Android图片库)
- Android Fresco图片处理库用法API英文原文文档2-1(Facebook开源Android图片库)
- Android Fresco图片处理库用法API英文原文文档2-2(Facebook开源Android图片库)
- Android Fresco图片处理库用法API英文原文文档4(Facebook开源Android图片库)
- Android自定义View的实现总结
- Android 图片缓存 - Fresco
- 网络编程---模仿新闻客户端
- 图片加载框架Fresco使用总结
- Fresco(1)——一个新的android图片加载库
- 前沿技术:FaceBook推出的Android图片加载库Fresco