LeafLoadView,一个酷炫的加载进度的view

之前看到了一个很炫的动态图,是一个加载的进度条

图片
图片

确实挺好看的,有一篇博客做了一个view,几乎一模一样的呈现了和动态图一样的效果

链接看原文

原博客背景用的是一张黄色的图片作为背景.想要修改的话是不能修改的.在我的自定义LeafLoadView中,添加了背景的修改功能

背景和边框都是由Android的view绘制出来的,添加了很多属性,可以自定义修改

我的github链接
LeafLoadView
很多的自定义View

效果图如下

1493335149523.mp4_1493336134.gif


LeafLoadView考入到工程就能使用

一些常见的属性

属性 功能
backgroundColor 加载精度条的背景颜色
borderColor 边框的颜色
seekColor 进度条的颜色
circleLeftStyle 左边起始加载的时候是选择圆弧还是扇形(boolean值)
rotationSpeed 右边圆形图片的旋转数度(一圈的毫秒值)
borderWidth 边框的宽度
circleWidth 圆形的外边框宽度
circleColor 圆形的外边框颜色

主要是利用Android的canvas。画出各个部分,仔细分析这个View,其中左边是一个半弧,上下各有两个矩形,右边是一个圆环,中间的飞车那车是一个旋转的动画,一步一步的实现这个动画

主要的代码:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //外层
    mPaint.setAntiAlias(true);
    mPaint.setStyle(Paint.Style.FILL);
    mPaint.setColor(mBackgroundColor);
    mRect = new RectF(0,0,mHeight,mHeight);
    mRectCen=new Rect(mHeight/2,0,mWidth-mHeight/2,mHeight);
    canvas.drawArc(mRect,90,180,true,mPaint);
    canvas.drawRect(mRectCen,mPaint);

    /***********seek****************/
    mPaint.reset();
    mPaint.setAntiAlias(true);
    mPaint.setColor(mSeekColor);
    mCurrentProgressPosition = (mWidth/*-mHeight/2*/) * progress / mTotalProgress;
    mRectSeek=new RectF(mBorderWidth,mBorderWidth,mHeight-mBorderWidth,mHeight-mBorderWidth);
    //判断在圆弧内部
    if(mCurrentProgressPosition<=mHeight-mBorderWidth){
        //单边角度
        mAngle = (int) Math.toDegrees(Math.acos((mHeight-mBorderWidth - mCurrentProgressPosition)/ (float) (mHeight-mBorderWidth)));
        //扫过的角度
        mStartAngle = 180 - mAngle;
        //进度的seekbar
        canvas.drawArc(mRectSeek,mStartAngle,mAngle*2,mCircleStyle,mPaint);
    }else { //判断在圆弧外了,需要填满圆弧,并且还要填矩形
        canvas.drawArc(mRectSeek,90,180,mCircleStyle,mPaint);
        seekRect=new Rect(mHeight/2,mBorderWidth,mCurrentProgressPosition-mHeight/2,mHeight-mBorderWidth);
        canvas.drawRect(seekRect,mPaint);
    }
    /***********seek over****************/
    //内层弧度
    mRect=new RectF(mBorderWidth/2,mBorderWidth/2,mHeight-mBorderWidth/2,mHeight-mBorderWidth/2);
    mPaint.reset();
    mPaint.setAntiAlias(true);
    mPaint.setColor(mBorderColor);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(mBorderWidth);
    canvas.drawArc(mRect,90,180,false,mPaint);
    //上下两条线
    mPath.moveTo(mHeight/2,mBorderWidth/2);
    mPath.lineTo(mWidth-mHeight/2,mBorderWidth/2);
    canvas.drawPath(mPath,mPaint);
    mPath.close();
    mPath.moveTo(mHeight/2,mHeight-mBorderWidth/2);
    mPath.lineTo(mWidth-mHeight/2,mHeight-mBorderWidth/2);
    canvas.drawPath(mPath,mPaint);
    mPath.close();
    //画圆
    mPaint.reset();
    mPaint.setAntiAlias(true);
    mPaint.setColor(mCircleColor);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(mCircleWidth);
    canvas.drawCircle(mWidth-mHeight/2,mHeight/2,mHeight/2-                     mCircleWidth/2,mPaint);
    //画右边的图片
//  mPaint.reset();
//  canvas.drawBitmap(mRightBitmap,mWidth-      mHeight+mBorderWidth,mBorderWidth,mPaint);
  }

通过这里,画出了主要的view。其中有风扇的动画

   public void rotationView(View view){
    ObjectAnimator animator = ObjectAnimator.ofFloat(view,"rotation",0,360);
    animator.setDuration(mRotationSpeed);
    animator.setRepeatCount(Animation.INFINITE);
    animator.setInterpolator(new LinearInterpolator());
    animator.setRepeatMode(Animation.RESTART);
    animator.start();
}

计算位置是比较麻烦的事儿,有需要的话可以研究研究,在activity中的使用也比较简单

如下:

public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
private int totalPro=100;
private int progress=0;
private LeafLoadView mLeafLoadView;

Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case 1:
                progress = progress + 1;
                mLeafLoadView.setPrograss(progress);
                mHandler.sendEmptyMessageDelayed(1,800); //800ms发送一次
                break;
            default:
                break;
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
}

private void initView() {
    mLeafLoadView = (LeafLoadView) findViewById(R.id.leafview);
    ImageView imageView= (ImageView) findViewById(R.id.fan_p);
    //设置精进度条的最大值
    mLeafLoadView.setTotalProgress(totalPro);
    //设置进度条每次的更新的值
    mLeafLoadView.rotationView(imageView);
    //handler发送延迟,更新界面
    mHandler.sendEmptyMessageDelayed(1,0);
}

布局如下

<RelativeLayout
    android:layout_width="302dp"
    android:layout_gravity="center_horizontal"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp">
<com.yk.leafloadview.LeafLoadView
    android:id="@+id/leafview"
    android:layout_width="300dp"
    android:layout_height="60dp"
    yk:backgroundColor="#fdf0c8"
    yk:borderColor="#fddd84"
    yk:seekColor="#fcc11d"
    yk:circleColor="#ffffff"
    yk:borderWidth="18"
    yk:circleWidth="8"
    yk:rotationSpeed="200"
    yk:circleLeftStyle="false"/>
<ImageView
    android:id="@+id/fan_p"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="7dp"
    android:src="@drawable/fengshan" />

其中每个属性的意思在上面都有提到,可以直接按照提示一个一个设置就能看出来效果了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,050评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • 1、发生了什么?今天早晨,老公因为豆浆机用完没刷而爆发了,说我不讲卫生之类的话,我被指责心里有点不舒服(我还是没有...
    秋日木槿阅读 167评论 0 0
  • 寂寞寂寞就好。深夜,内心空空如也,大学已过去五分之四,得到过什么,失去了什么,往往还没有初高中来得丰富。眨眼即逝,...
    阳光之下的鱼阅读 106评论 0 0
  • 季节是一场轮回,冬的寒,已经终结于和煦的春风中,轻嗅,春的气息,久别重逢的欣喜油然而生。看那爬上枝头的葱茏,轻...
    那些年聆听的阅读 188评论 0 1