自定义View基础之——图片加载进度条

学会了Paint,Canvas的基本用法之后,我们就可以动手开始实践了,先写个简单的图片加载进度条看看。

按照惯例,先看效果图,再决定要不要往下看:

既然看到这里了,应该是想了解这个图片加载进度条了,我们先看具体用法,再看自定义View的实现:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/img"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:scaleType="centerCrop"
        android:layout_centerInParent="true"/>
    <com.example.circleprogresstest.CircleProgressView
        android:id="@+id/progressView"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_centerInParent="true"
        custom:isShowProgress="true" />
</RelativeLayout>
ImageLoader.getInstance().displayImage(url, imageView, options,
        new SimpleImageLoadingListener() ,
        new ImageLoadingProgressListener() {
            @Override
            public void onProgressUpdate(String imageUri, View view, int current, int total) {
                if(current==total){
                    progressView.setVisibility(View.GONE);
                }else{
                    progressView.setSweepAngle((int)(360*current*1.0f/total));
                    progressView.postInvalidate();
                }
            }
        }
);

可以看出,以上的用法,非常简单,在xml中添加我们自定义的View,和添加textview或者button完全相同,只是多了我们自己的自定义属性而已,可以设置圆的颜色,以及文字颜色,大小等等。之后,在MainActivity中使用的方法也是同样简单,只要在图片的进度更新的时候,同时更新我们进度条的进度就行了。

下面我们具体说下我们实现自定义进度条的过程,我们只需要重写onDraw()方法就够了,很明显,我们的进度条包括三部分,内圈圆,外圈圆弧,中间的文字,具体看代码:

protected void onDraw(Canvas canvas) {
    mWidth=getMeasuredWidth();
    mHeight=getMeasuredHeight();
    radius=(float)(Math.min(mWidth,mHeight)*1.0/2)-strokeWidth/2;
    //绘制内圈圆
    mPaint.setColor(initColor);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(strokeWidth);
    canvas.drawCircle(mWidth/2,mHeight/2,radius,mPaint);
    //绘制覆盖的圆弧
    mPaint.setColor(coverColor);
    RectF rectF=new RectF(mWidth/2-radius,mHeight/2-radius,mWidth/2+radius,mHeight/2+radius);
    canvas.drawArc(rectF,-90,sweepAngle,false,mPaint);
    //绘制中间的文本
    if(isShowProgress){
        progressText=String.format(getResources().getString(R.string.progress_text),(int)(sweepAngle*100.0/360));
        mPaint.setTextSize(textSize);
        mPaint.setColor(textColor);
        if(mBound==null){
            mBound=new Rect();
        }
        mPaint.getTextBounds(progressText,0,progressText.length(),mBound);
        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawText(progressText,mWidth/2-mBound.width()/2,mHeight/2+mBound.height()/2,mPaint);
    }
}

当然,为了让我们可以自定义进度条的大小颜色,我们还采用了自定义属性,并且在构造器中,也需要加载xml中的各项属性:

<resources>
    <declare-styleable name="CircleProgressView">
        <attr name="initColor" format="color"/>
        <attr name="coverColor" format="color"/>
        <attr name="strokeWidth" format="dimension"/>
        <attr name="progressTextSize" format="dimension"/>
        <attr name="progressTextColor" format="color"/>
        <attr name="isShowProgress" format="boolean"/>
    </declare-styleable>
</resources>
private void initValues(Context context, AttributeSet attrs, int defStyleAttr){
    TypedArray typedArray=context.getTheme().obtainStyledAttributes(attrs,R.styleable.CircleProgressView,defStyleAttr,0);
    int num=typedArray.getIndexCount();
    for(int i=0;i<num;i++){
        int attr=typedArray.getIndex(i);
        switch (attr){
            case R.styleable.CircleProgressView_initColor:
                initColor=typedArray.getColor(attr,Color.GRAY);
                break;
            case R.styleable.CircleProgressView_coverColor:
                coverColor=typedArray.getColor(attr,Color.BLACK);
                break;
            case R.styleable.CircleProgressView_strokeWidth:
                strokeWidth=typedArray.getDimensionPixelOffset(attr,5);
                break;
            case R.styleable.CircleProgressView_progressTextSize:
                textSize=typedArray.getDimensionPixelSize(attr,30);
                break;
            case R.styleable.CircleProgressView_progressTextColor:
                textColor=typedArray.getColor(attr,Color.BLACK);
                break;
            case R.styleable.CircleProgressView_isShowProgress:
                isShowProgress=typedArray.getBoolean(attr,false);
                break;
            default:
                break;
        }
    }
    typedArray.recycle();

    mPaint=new Paint();
    mPaint.setAntiAlias(true);
}

源码下载

时间: 2024-10-07 01:29:57

自定义View基础之——图片加载进度条的相关文章

WebView 自定义错误界面,WebView 加载进度条,和Logding 效果

---恢复内容开始--- 下载地址,代码就不粘贴了 http://pan.baidu.com/s/1eQncg86 ---恢复内容结束--- 我没有判断是不是网络原因,各位自行判断吧,图片错误信息,及重现加载各种美化的样式请自己写吧,右边的是加载网页的进度条 里面还有一个弹出的dialog 的加载效果, 地址 http://www.cnblogs.com/Mr-Wu/p/4187934.html

js实现页面图片加载进度条

//html <div id="loading" class="loading"> <div class="load"> <span id="loadingSpan"></span> </div> </div> <div id="content"><img src="content_01.jpg"

给WebView添加漂亮的加载进度条

为了增强用户体验,所有在WebView头部给加了个进度条,看起来不错哦. 布局XMl:activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent&q

webView 加载进度条,webView返回键重写机制

1.图片延时加载 brower = (WebView) this.findViewById(R.id.brower); settings = brower.getSettings(); settings.setJavaScriptEnabled(true); //阻塞图片下载 settings.setBlockNetworkImage(true); private class Client extends WebViewClient     {         @Override        

Android开发--------------WebView(二)之WebView的滑动底部顶部监听,加载进度条等设置

整理一下WebView的一些常用设置,滑动监听,让跳转的页面也在WebView里显示,加载进度,获得标题等等 一,滑动监听 滑动监听的话是需要在WebView基础之上在加强一下,因为在WebView没有直接监听滑动的方法,看WebView的源码则会发现有一个 protected void onScrollChanged(int l, int t, int oldl, int oldt) : 这个方法.是受到保护的所以我们无法直接使用,所以我们写一个加强的WebView,利用接口回调. Scrol

网站顶部显示预加载进度条preload.js

网站加载的速度快的话,不会显示进度条加载时候的样式. 支持性主流浏览器都支持,ie浏览器需要9以上9也支持. 使用方法 <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> <script src="js/preload.js"></script> <script type="text/javascript">

【Web前沿技术】纯 CSS3 打造的10个精美加载进度条动画

之前向大家介绍8款优秀的 jQuery 加载动画和进度条插件,今天这篇文章向大家推荐10个纯 CSS3 代码实现精美加载进度条动画效果的方案.加载动画和进度条在网站和 Web 应用中的使用非常流行,特别是在使用 Ajax 技术加载内容的应用场景中,使用时尚的加载动画和进度条告诉用户内容正在加载中是一种非常友好的方式. 您可能感兴趣的相关文章 20个非常绚丽的 CSS3 特性应用演示 23个纯 CSS3 打造的精美LOGO图案 35个让人惊讶的 CSS3 动画效果演示 推荐12个漂亮的 CSS3

你没见过吧?16款形态各异的加载进度条设计

互联网连接越来越快,但难免有一些时刻需要我们等待.在这种情况下,创意的设计师尽力减轻用户等待的痛苦,苦思敏想设计各种创意的进度条(或加载条)效果 ,让用户等待的过程变得更加愉悦. 您可能感兴趣的相关文章 22套 Web & Mobile PSD 用户界面素材 45套精美的手机界面设计素材和设计工具 分享30套精美的Web和手机开发UI素材 60个精美的免费移动开发PSD素材资源 45套新鲜出炉的精美 PSD 网页设计素材 Loading by pearlsomani Flat Loading B

【android】带加载进度条的WebView (附demo下载)

/** * * 此WebViewWithProgress继承自Relativielayout, * 如果要设置webview的属性,要先调用getWebView()来取得 * webview的实例 * * @author Administrator * */ public class WebViewWithProgress extends RelativeLayout{ private Context context; private WebView mWebView = null; //水平进