2016-01-14 17:00:03 andywuchuanlong 阅读数 3733

在介绍本文动画效果实现之前,先来介绍属性动画相关的几个知识点。

  1. ValueAnimator与ObjectAnimator。
  2. Interpolator插值器与TypeEvaluator估值器。

在Android3.0之前,系统提供了两种动画效果实现方式,帧动画frame-by-frame animation和补间动画tweened animation。帧动画就是类似电影播放一样,将整部影片拆分成一片片的然后连贯起来播放。补间动画则可以实现对view的缩放、平移、旋转等操作。在3.0之后,出现了一种新的动画模式称为属性动画property animation。

属性动画产生的原因

属性动画的出现不是用来替代补间动画的,而是用来解决补间动画所不能够完成的事件的。如果我们的需求超出了操控view的旋转、缩放、平移等操作范围,那么我们就需选择属性动画去实现了。那么属性动画可以做到哪些补间动画做不到的事情呢?下面列举几点,当然属性动画的功能很强大,不仅限于我列举的几点。

  1. 属性动画可以做到对一个非view类进行动画操作。
  2. 属性动画可以做到真正的改变view对象的属性值。而补间动画只是改变了view的动画效果。

ValueAnimator与ObjectAnimator

ObjectAnimator是属性动画中最总要的执行类,ObjectAnimator可以操作某个对象的属性值,但是这个属性值必须要有get和set方法,同时也可以设置view的执行线路,通过插值器来控制。
举个简单的例子:

ObjectAnimator
.ofFloat(view, "rotationY", 0.0F, 360.0F)
.setDuration(500)
.start();

其可操作的属性有x/y;scaleX/scaleY;rotationX/ rotationY;transitionX/ transitionY等。
上面的例子是修改view的单个属性值,同样也可以同时修改多个属性,下面介绍两种

  1. PropertyValuesHolder属性值持有者

    PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", 0, 1);
    
    PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 1);
    
    ObjectAnimator.ofPropertyValuesHolder( this, pvhLeft, pvhTop).
    
  2. 提供一个不存在的属性值

    ObjectAnimator anim = ObjectAnimator.ofFloat(view, "long", 1.0F, 0.0F).setDuration(500);
    anim.start();
    anim.UpdateListener(new AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float cVal = (Float) animation.getAnimatedValue();
            view.setAlpha(cVal);
            view.setScaleX(cVal);
            view.setScaleY(cVal);
        }
    });
    

上面提到的都是修改对象已有的setter和getter方法的属性值。那么如果对象没有为某个属性提供提供setter和getter方法呢,我们也可以做到修改这些属性值,下面提供两种实现方式:

  1. 通过valueAnimation来实现,这个下面会讲解。
  2. 通过自己写一个包装类来实现。然后为该属性提供setter和getter方法。

    class ViewWrapper{
        private View mView;
        public int getWidth(){
            return mView.getLayoutParams().width;
        }
    }
    

ValueAnimator包含Property Animation动画的所有核心功能,如动画时间,开始、结束属性值,相应时间属性值计算方法等。
属性动画的应用有两个步骤:
1、计算属性的值。2、根据属性值执行相应的动作。
ValueAnimator只是完成了第一步骤,而要完成第二步还要借助于ValueAnimator.onUpdateListener接口,在此方法中可以通过ValueAnimator对象的getAnimatedValue()函数可以得到当前的属性值。

ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.addUpdateListener(new AnimatorUpdateListener  () {
    @Override
     public void onAnimationUpdate(ValueAnimator animation) {
         Log.i("update", ((Float)animation.getAnimatedValue()).toString());
         // 此处可以根据getAnimatedValue获取到的属性值改变view相关的属性从而执行某些动作
     }
});
animation.setInterpolator(new CycleInterpolator(3));
animation.start();

Time Interpolator插值器与TypeEvaluator估值器

Time interplator:定义了属性值变化的方式,如线性均匀改变,开始慢然后逐渐快等。在Property Animation中是TimeInterplator,在View Animation中是Interplator,这两个是一样的,在3.0之前只有Interplator,3.0之后实现代码转移至了TimeInterplator。Interplator继承自TimeInterplator,内部没有任何其他代码。

  1. AccelerateInterpolator 加速,开始时慢中间加速
  2. DecelerateInterpolator 减速,开始时快然后减速
  3. AccelerateDecelerateInterolator 先加速后减速,开始结束时慢,中间加速
  4. AnticipateInterpolator 反向 ,先向相反方向改变一段再加速播放
  5. AnticipateOvershootInterpolator 反向加回弹,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值
  6. BounceInterpolator 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
  7. CycleIinterpolator 循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)
  8. LinearInterpolator 线性,线性均匀改变
  9. OvershottInterpolator 回弹,最后超出目的值然后缓慢改变到目的值
  10. TimeInterpolator 一个接口,允许你自定义interpolator,以上几个都是实现了这个接口

TypeEvaluator:根据属性的开始、结束值与TimeInterpolation计算出的因子计算出当前时间的属性值,android提供了以下几个evalutor:

  1. IntEvaluator:属性的值类型为int。
  2. FloatEvaluator:属性的值类型为float。
  3. ArgbEvaluator:属性的值类型为十六进制颜色值。
  4. TypeEvaluator:一个接口,可以通过实现该接口自定义Evaluator。

当然我们也可以自己定义估值器,如下:

public class FloatEvaluator implements TypeEvaluator {
     public Object evaluate(float fraction, Object startValue, Object endValue) {
            float startFloat = ((Number) startValue).floatValue();
            return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);
     }
}

实例
接下来我们要实现的就是如下的 效果图:
这里写图片描述
在本例的实现中我们的重点也是在ValueAnimator和ObjectAnimator中读者可以结合上述知识内容来消化本例的动画技术。附上代码:

package com.example.custom.animation;

import java.util.ArrayList;

import com.example.custom.R;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RadialGradient;
import android.graphics.Shader;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.widget.LinearLayout;

public class BouncingBalls extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.bouncing_balls);
        LinearLayout container = (LinearLayout) findViewById(R.id.container);
        container.addView(new MyAnimationView(this));
    }

    public class MyAnimationView extends View {

        private static final int RED = 0xffFF8080;
        private static final int BLUE = 0xff8080FF;

        public final ArrayList<ShapeHolder> balls = new ArrayList<ShapeHolder>();
        AnimatorSet animation = null;


        public MyAnimationView(Context context) {
            super(context);
            ValueAnimator colorAnim = ObjectAnimator.ofInt(this, "backgroundColor", RED, BLUE);
            colorAnim.setDuration(3000);
            colorAnim.setEvaluator(new ArgbEvaluator());
            colorAnim.setRepeatCount(ValueAnimator.INFINITE);
            colorAnim.setRepeatMode(ValueAnimator.REVERSE);
            colorAnim.start();
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {

            if (event.getAction() != MotionEvent.ACTION_DOWN &&
                    event.getAction() != MotionEvent.ACTION_MOVE) {
                return false;
            }

            // 初始化一个跳跳球
            ShapeHolder newBall = initBouncingBall(event.getX(), event.getY());

            float startY = newBall.getY();
            float endY = getHeight() - 50;
            float h = (float)getHeight();
            float eventY = event.getY();
            int duration = (int)(500 * ((h - eventY)/h));

            // 操作newBall的Y属性值
            ValueAnimator bounceAnim = ObjectAnimator.ofFloat(newBall, "y", startY, endY);
            bounceAnim.setDuration(duration);
            bounceAnim.setInterpolator(new AccelerateInterpolator());

            ValueAnimator squashAnim1 = ObjectAnimator.ofFloat(newBall, "x", newBall.getX(),newBall.getX() - 25f);
            squashAnim1.setDuration(duration/4);
            squashAnim1.setRepeatCount(1);
            squashAnim1.setRepeatMode(ValueAnimator.REVERSE);
            squashAnim1.setInterpolator(new DecelerateInterpolator());

            ValueAnimator squashAnim2 = ObjectAnimator.ofFloat(newBall, "width", newBall.getWidth(),newBall.getWidth() + 50);
            squashAnim2.setDuration(duration/4);
            squashAnim2.setRepeatCount(1);
            squashAnim2.setRepeatMode(ValueAnimator.REVERSE);
            squashAnim2.setInterpolator(new DecelerateInterpolator());

            ValueAnimator stretchAnim1 = ObjectAnimator.ofFloat(newBall, "y", endY, endY + 25f);
            stretchAnim1.setDuration(duration/4);
            stretchAnim1.setRepeatCount(1);
            stretchAnim1.setInterpolator(new DecelerateInterpolator());
            stretchAnim1.setRepeatMode(ValueAnimator.REVERSE);

            ValueAnimator stretchAnim2 = ObjectAnimator.ofFloat(newBall, "height",newBall.getHeight(), newBall.getHeight() - 25);
            stretchAnim2.setDuration(duration/4);
            stretchAnim2.setRepeatCount(1);
            stretchAnim2.setInterpolator(new DecelerateInterpolator());
            stretchAnim2.setRepeatMode(ValueAnimator.REVERSE);

            ValueAnimator bounceBackAnim = ObjectAnimator.ofFloat(newBall, "y", endY, startY);
            bounceBackAnim.setDuration(duration);
            bounceBackAnim.setInterpolator(new DecelerateInterpolator());

            AnimatorSet bouncer = new AnimatorSet();
            bouncer.play(bounceAnim).before(squashAnim1);
            bouncer.play(squashAnim1).with(squashAnim2);
            bouncer.play(squashAnim1).with(stretchAnim1);
            bouncer.play(squashAnim1).with(stretchAnim2);
            bouncer.play(bounceBackAnim).after(stretchAnim2);

            ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
            fadeAnim.setDuration(250);
            fadeAnim.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    balls.remove(((ObjectAnimator)animation).getTarget());
                }
            });

            AnimatorSet animatorSet = new AnimatorSet();
            animatorSet.play(bouncer).before(fadeAnim);

            animatorSet.start();

            return true;
        }

        private ShapeHolder initBouncingBall(float x, float y) {

            int red = (int)(Math.random() * 255);
            int green = (int)(Math.random() * 255);
            int blue = (int)(Math.random() * 255);
            int color = 0xff000000 | red << 16 | green << 8 | blue;
            int darkColor = 0xff000000 | red/4 << 16 | green/4 << 8 | blue/4;

            // 实例化一个圆形
            OvalShape circle = new OvalShape();
            circle.resize(50f, 50f);

            // 设置画笔的形状
            ShapeDrawable drawable = new ShapeDrawable(circle);
            Paint paint = drawable.getPaint(); 

            // 第一个,第二个参数表示渐变圆中心坐标,半径,圆心颜色,圆边缘颜色,渲染器平铺模式
            RadialGradient gradient = new RadialGradient(37.5f, 12.5f, 50f, color, darkColor, Shader.TileMode.CLAMP);
            // 给画笔设置著色器
            paint.setShader(gradient);

            ShapeHolder shapeHolder = new ShapeHolder(drawable);
            shapeHolder.setX(x - 25f);
            shapeHolder.setY(y - 25f);
            shapeHolder.setPaint(paint);
            balls.add(shapeHolder);

            return shapeHolder;
        }

        @Override
        protected void onDraw(Canvas canvas) {
            for (int i = 0; i < balls.size(); ++i) {
                ShapeHolder shapeHolder = balls.get(i);
                canvas.save();
                canvas.translate(shapeHolder.getX(), shapeHolder.getY());
                shapeHolder.getShape().draw(canvas);
                canvas.restore();
            }
        }
    }
}
package com.example.custom.animation;

import android.graphics.Paint;
import android.graphics.RadialGradient;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.Shape;
import android.view.View;


public class ShapeHolder {
    private float x = 0, y = 0;
    private int color;
    private float alpha = 1f;
    private Paint paint;
    private ShapeDrawable shape;
    private RadialGradient gradient;
    public void setPaint(Paint value) {
        paint = value;
    }
    public Paint getPaint() {
        return paint;
    }

    public void setX(float value) {
        x = value;
    }
    public float getX() {
        return x;
    }
    public void setY(float value) {
        y = value;
    }
    public float getY() {
        return y;
    }
    public void setShape(ShapeDrawable value) {
        shape = value;
    }
    public ShapeDrawable getShape() {
        return shape;
    }
    public int getColor() {
        return color;
    }
    public void setColor(int value) {
        shape.getPaint().setColor(value);
        color = value;
    }
    public void setGradient(RadialGradient value) {
        gradient = value;
    }
    public RadialGradient getGradient() {
        return gradient;
    }

    public void setAlpha(float alpha) {
        this.alpha = alpha;
        shape.setAlpha((int)((alpha * 255f) + .5f));
    }

    public float getWidth() {
        return shape.getShape().getWidth();
    }

    public void setWidth(float width) {
        Shape s = shape.getShape();
        s.resize(width, s.getHeight());
    }

    public float getHeight() {
        return shape.getShape().getHeight();
    }
    public void setHeight(float height) {
        Shape s = shape.getShape();
        s.resize(s.getWidth(), height);
    }

    public ShapeHolder(ShapeDrawable s) {
        shape = s;
    }
}
2013-09-23 09:03:18 u012136694 阅读数 945

一款很不错的安卓僵尸跳跳游戏源码下载,该android游戏的源码比较完整,值得大家的学习。


类似驴子跳的玩法.丰富的道具!可爱的画面!
玩家需要左右摇晃手机保证小僵尸不要掉下跳板,在完成关卡的前提下找到任务道具,并竟可能的搜集星星.
草靴:增加弹跳力
筋斗云:获得飞行能力
铁钉:所有跳板静止
酒葫芦:改变重力感应方向
闪电:所有跳板变成易碎


源码下载

2013-02-28 12:27:00 weixin_30421809 阅读数 8

 

 如图所示,这是一款android的跳格子游戏(名字叫小鸟跳跳,图中的游戏为第二版)——红色的格子只能跳一次,黄色的格子可以跳2次,控制小鸟从起点跳到终点

 我 们的目的是使小鸟可以到达终点,注意,这里的到达也许表述地并不是很清晰,应该说,是到达且恰好到达终点,这应该说是有一定的难度的,毕竟是多一步或者少 一步也是不行的(想当年我玩飞行棋的时候也在这个方面吃过不少的亏,明明飞机就要进入终点了,但是就因为哪怕是一步,就一直徘徊在那里,真心郁闷啊!)

 模型的简化

 

 一 个人力无法预测的原因,我无法传图片了,郁闷中,我就只能说明一下图片的来源了(Source:HDOJ 1208),这里,我们每踩到一个小格子,都可以选择向右或者向下走(起点在左上角,终点在右下角,向上走或者向左走都是不可以的,因为这样的话会造成某 种“迂回”策略)

  DP策略

给出这样一个矩阵,问从map[1][1] map[n][n],有几种不同的跳法。

map[ i ][ j ]表示跳几格   f [ i ][ j ] 表示有几种条法

其实就是一个子状态继承问题,如果map[ i ][ j ]k,那么 f [ i+k ][ j ] f[i][j+k] 就可以增加 f [ i ][ j ]种跳跃方法了。

 

  Solve:

  

 1  #include<stdio.h>
 2  #include<string.h>
 3  
 4  int map[50][50];
 5  __int64 f[50][50];
 6  
 7  int main()
 8  {
 9    int i,j,n;
10    char s[50];
11    //读取案例数到文件尾
12    while(scanf("%d",&n)!=EOF)
13    {
14      //由于需要用gets来读一行,所以利用getchar()读掉一个回车
15      getchar();
16      if(n==-1)
17        return 0;
18      //读入数字串并将其转为int型的二维数组
19      for(i=0;i<n;i++)
20      {
21        gets(s);
22        for(j=0;j<n;j++)
23          map[i][j]=s[j]-'0';                
24      }                      
25      //初始化f数组,这里,有些编译器是可以自动实现的
26      memset(f,0,sizeof(f));
27      //到达最开始的那个点(左上角)有1种走法
28      f[0][0]=1;
29      for(i=0;i<n;i++)
30        for(j=0;j<n;j++)
31        {
32          //等于0相当于是一个"死点"
33          if(map[i][j]==0)
34            continue;
35          //有向右和向下两个方向,分别存储状态值
36          f[i+map[i][j]][j]+=f[i][j];
37          f[i][j+map[i][j]]+=f[i][j];                
38        }    
39      printf("%I64d\n",f[n-1][n-1]);
40    }
41    return 0;    
42  }
43  
44 
45 


转载于:https://www.cnblogs.com/tuanzang/archive/2013/02/28/2936649.html

2018-12-14 11:40:38 Dream_Weave 阅读数 182

零、系统自带

  1. Apple Store
  2. 文件
  3. 信息
  4. 日历
  5. 照片
  6. 相机
  7. 时钟
  8. 备忘录
  9. 提醒事项
  10. App Store
  11. 设置
  12. Safari 浏览器
  13. 待更新...

 

一、音乐

  1. 沃音乐
  2. K米
  3. QQ音乐
  4. 音乐(系统自带)
  5. 网易云音乐
  6. 铃声多多
  7. 酷狗音乐
  8. 全民K歌
  9. 荔枝
  10. 待更新...

 

二、体育

  1. 跳跳
  2. 待更新...

 

三、生活

  1. 大众点评
  2. 滴滴出行
  3. 手机营业厅
  4. 摩拜单车
  5. OFO共享单车
  6. 哈啰出行
  7. 微医
  8. 铁路12306
  9. 杭州地铁
  10. 电信营业厅
  11. inm
  12. 贝壳找房
  13. 安居客
  14. 汽车报价大全
  15. 汽车报价
  16. 汽车之家
  17. 待更新...

 

四、职场

  1. 看准
  2. 企查查
  3. 前程无忧
  4. 拉钩
  5. 待更新...

 

五、新闻

  1. 少数派
  2. AppSo
  3. 推酷
  4. 爱Q生活网
  5. 今日头条
  6. 腾讯新闻
  7. 天气(系统自带)
  8. QQ浏览器
  9. 中关村在线
  10. 彩云天气 Pro
  11. IT 之家
  12. Chrome
  13. Price Tag
  14. 待更新...

 

六、购物

  1. 淘票票
  2. 美团
  3. 多点
  4. 快票出行
  5. 手机淘宝
  6. 一淘
  7. 口碑
  8. 手机天猫
  9. 闲鱼
  10. 当当
  11. 美团外卖
  12. 肯德基
  13. 饿了么
  14. 苏宁易购
  15. 每日优鲜
  16. 拼多多
  17. 阿里巴巴
  18. 飞猪
  19. 聚划算
  20. 京东
  21. 待更新...

 

七、导航

  1. 腾讯地图
  2. 百度地图
  3. 地图(系统自带)
  4. 待更新...

 

八、信仰

  1. 福音TV
  2. 灵修圣经
  3. 微读圣经
  4. 诗歌本
  5. 赞!
  6. IIIM神学公开课程
  7. 查经(http://www.godcom.net/chajing/
  8. 待更新...

 

九、教育

  1. 扇贝阅读
  2. 扇贝听力
  3. 扇贝单词
  4. 牛客
  5. 慕课网
  6. 极客学院
  7. Hello Uni-app
  8. Hello MUI
  9. Hello H5
  10. 印象笔记
  11. w3cschool
  12. 英语流利说
  13. CSDN
  14. W3
  15. 欧陆词典
  16. 网易有道词典
  17. 腾讯翻译君
  18. C++
  19. Grape
  20. 腾讯课堂
  21. 中国大学慕课
  22. JVM
  23. JS Language
  24. 网易云课堂
  25. 百度文库
  26. 作业帮
  27. Dash
  28. C Language
  29. PP题库
  30. 算法动画图解
  31. 网易卡塔编程
  32. 前端学院
  33. 51CTO学院
  34. 待更新...

 

十、社交

  1. 微博
  2. QQ
  3. 知乎
  4. QQ空间
  5. 微信
  6. TIM QQ
  7. QQ邮箱
  8. 电话(系统自带)
  9. Telegram
  10. Facebook
  11. Messenger
  12. 简书
  13. 微信读书
  14. 百度
  15. 旺信
  16. Signal
  17. 待更新...

 

十一、工具

  1. 订阅号助手
  2. 百度网盘
  3. 腾讯微云
  4. WPS Office
  5. 数计Pro
  6. Connect Drive
  7. Pin
  8. Shadowrocket
  9. 计算器(系统自带)
  10. Lighten
  11. 应用兔
  12. Kitsunebi
  13. 腾讯手机管家
  14. Calculator
  15. EZCast
  16. 指尖遥控
  17. QQ安全中心
  18. QQ同步助手
  19. Font Keyboard
  20. Calculator ∞
  21. Text Only
  22. 扫描全能王
  23. 遥控精灵
  24. DataFlow Pro
  25. 快贴
  26. OfficeSuite
  27. Infy拦截
  28. JSBox
  29. FancyDays
  30. 坚果云扫描
  31. 坚果云
  32. 花生壳管理
  33. Opener
  34. FileExolorer
  35. ImageGet
  36. 白描
  37. 捷径
  38. 白描取字
  39. EasyConnect
  40. 花样文字
  41. 拍照取字
  42. WidUseful
  43. 佚览
  44. PostWang
  45. Snaplight
  46. 彩虹倒计时
  47. 文件扫描宝
  48. WiFi万能钥匙 Pro
  49. 待更新...

 

十二、效率

  1. 习惯商店
  2. One Plan
  3. Forest
  4. 小睡眠
  5. FocusTimer
  6. Again Pro
  7. 我的小目标
  8. 待更新...

 

十三、视图

  1. 美颜相机
  2. 美图秀秀
  3. YouTube
  4. 腾讯视频
  5. 爱奇艺
  6. 壁纸
  7. 可立拍
  8. 500px
  9. 神奇锁屏
  10. 抖音短视频
  11. 雄迈看看
  12. 有看头
  13. 优酷
  14. Picsew
  15. Pico
  16. 录屏套壳
  17. OneScreen
  18. PicTailor
  19. Frame
  20. PhotoX
  21. Background
  22. 大千壁纸
  23. Epica 2 Pro
  24. 待更新...

 

十四、钱包

  1. 翼支付
  2. 支付宝
  3. 中国农业银行
  4. 中国工商银行
  5. 中国银行
  6. 钱包(系统自带)
  7. 中国建设银行
  8. 交通银行
  9. 沃钱包
  10. 云闪付
  11. 丰收互联
  12. 京东金融
  13. 待更新...
2016-03-12 16:38:22 Smart_YC 阅读数 1299

最近学了好多第三方的类库,用起来特别炫酷,故此来分享给像我一样的新手

CircularProgressButton是大神 林惠文排名最高的一个,大概在28名左右,这个控件有点特殊,用起来效果挺炫的,

它有四个状态,默认时是单纯的一个button,但在运行时,它会变成一个progress在不停的转,

成功时,它会跳跳转为一个绿色背景中间一个打钩的状态,失败时呈现一个红色背景打叉的状态。


布局文件

  • <com.dd.CircularProgressButton
  •             android:layout_width="300dp"
  •             android:layout_height="40dp"
  •             app:cpb_iconComplete="@drawable/ic_cpb_action_accept"//成功时的状态图标
  •             app:cpb_textError="@drawable/ic_cpb_action_cancel"//失败时的状态图标
  •             app:cpb_textIdle="登录" />//默认文字,注意:text在这里没用了
  • 四个状态的使用
  • btnlogin.setIndeterminateProgressMode(true);
     btnlogin.setProgress(50);//运行状态
    btnlogin.setProgress(100);//成功状态
  • btnlogin.setProgress(-1);//失败状态
  • btnlogin.setProgress(0);//默认状态
  • 当处于失败状态是,如果按钮一直处于失败状态,给用户的体验就会不好,
  • 因此我们要给它一个时间,例如:登录失败时,过两秒它就又变成默认状态
  • 所以我给他起了一个线程
  • handler.postDelayed(new Runnable() {

                @Override
                public void run() {
                    btnlogin.setProgress(0);
                }
            }, 2000);//在失败时。隔两秒钟自动回到默认状态
没有更多推荐了,返回首页