当前位置: 移动技术网 > 移动技术>移动开发>Android > Android实现创意LoadingView动画效果

Android实现创意LoadingView动画效果

2019年07月24日  | 移动技术网移动技术  | 我要评论

android上的热火锅煮萝卜蔬菜的loading动画效果。 这是一个锅煮萝卜的loading动画,效果仿照自之前ios上看到的一个效果,觉得挺有意思,就移植过来了,在此完成了dialog的样式,方便使用者作为loadingview去使用。
关键性代码:

package yellow5a5.demo.boilingloadingview.view;
 
import android.animation.animator;
import android.animation.animatorlisteneradapter;
import android.animation.valueanimator;
import android.content.context;
import android.graphics.drawable.clipdrawable;
import android.os.handler;
import android.os.message;
import android.util.attributeset;
import android.util.typedvalue;
import android.view.layoutinflater;
import android.view.view;
import android.view.animation.animation;
import android.view.animation.animationutils;
import android.widget.imageview;
import android.widget.relativelayout;
 
import java.util.timer;
import java.util.timertask;
 
import yellow5a5.demo.boilingloadingview.r;
 
/**
 * created by weiwu on 16/1/2.
 */
public class boilingpanview extends relativelayout {
 
 
  private view mview;
  private clipdrawable mwaterdrawable;
 
  private waterview mwaterview;
  private flameview mflameview;
 
  private view mpea1;
  private view mpea2;
  private imageview mpotato;
  private imageview mcarrot;
  private imageview mcoverview;
 
  private animation mleftinanim;
  private animation mrightinanim;
 
  private boolean isrightrotate = true;
  private valueanimator mcoveranim;
 
  private boilinganimlistener mboilinganimlistener;
 
  public interface boilinganimlistener {
    //初始动画结束监听
    void onfirstanimend();
  }
 
  public void setboilinganimlistener(boilinganimlistener l) {
    this.mboilinganimlistener = l;
  }
 
  private handler mhandle = new handler(new handler.callback() {
    @override
    public boolean handlemessage(message msg) {
      if (msg.what == 0x0000) {
        mwaterdrawable.setlevel(mwaterdrawable.getlevel() + 800);
      }
      return false;
    }
  });
 
  public boilingpanview(context context) {
    this(context, null);
  }
 
  public boilingpanview(context context, attributeset attrs) {
    this(context, attrs, 0);
  }
 
  public boilingpanview(context context, attributeset attrs, int defstyleattr) {
    super(context, attrs, defstyleattr);
    mview = layoutinflater.from(context).inflate(r.layout.boiling_pan, this, true);
    initview();
    initstartanim();
    initcoveranim();
  }
 
  private void initview() {
    mwaterview = (waterview) mview.findviewbyid(r.id.img_water);
    mflameview = (flameview) mview.findviewbyid(r.id.flame);
    mcoverview = (imageview) mview.findviewbyid(r.id.img_cover);
    mpea1 = mview.findviewbyid(r.id.img_pea1);
    mpea2 = mview.findviewbyid(r.id.img_pea2);
    mpotato = (imageview) mview.findviewbyid(r.id.img_potato);
    mcarrot = (imageview) mview.findviewbyid(r.id.img_carrot);
    mwaterdrawable = (clipdrawable) mwaterview.getdrawable();
  }
 
  private void initstartanim() {
    mleftinanim = animationutils.loadanimation(getcontext(), r.anim.left_in_anim);
    mrightinanim = animationutils.loadanimation(getcontext(), r.anim.right_in_anim);
  }
 
  /*
  抖动的盖子
   */
  private void initcoveranim() {
    mcoveranim = valueanimator.offloat(0f, 1f, 0f).setduration(800);
    mcoveranim.setrepeatmode(animation.reverse);
    mcoveranim.setrepeatcount(-1);
    mcoveranim.addupdatelistener(new valueanimator.animatorupdatelistener() {
      @override
      public void onanimationupdate(valueanimator animation) {
        float value = (float) animation.getanimatedvalue();
        if (isrightrotate) {
          mcoverview.setrotation(value * 5);
        } else {
          mcoverview.setrotation(-value * 5);
        }
        mcoverview.settranslationy(-value * typedvalue.applydimension(typedvalue.complex_unit_dip, 5, getresources().getdisplaymetrics()));
      }
    });
    mcoveranim.addlistener(new animatorlisteneradapter() {
      @override
      public void onanimationrepeat(animator animation) {
        super.onanimationrepeat(animation);
        isrightrotate = !isrightrotate;
      }
    });
  }
 
  /*
  开始启动的动画
   */
  public void beginfirstinanim() {
    mpea1.setvisibility(visible);
    mpea2.setvisibility(visible);
    mpotato.setvisibility(visible);
    mcarrot.setvisibility(visible);
    mcoverview.setvisibility(visible);
    mpea1.startanimation(mleftinanim);
    mpea2.startanimation(mleftinanim);
    mpotato.startanimation(mleftinanim);
    mcarrot.startanimation(mrightinanim);
    mcoverview.startanimation(mrightinanim);
    mrightinanim.setanimationlistener(new animation.animationlistener() {
      @override
      public void onanimationstart(animation animation) {
 
      }
 
      @override
      public void onanimationend(animation animation) {
        if (mboilinganimlistener != null) {
          //这里是为了给外部留有操作的空间
          mboilinganimlistener.onfirstanimend();
        } else {
          beginboilinganim();
        }
      }
 
      @override
      public void onanimationrepeat(animation animation) {
 
      }
    });
  }
 
  /*
  开始加水燃火动画
   */
  public void beginboilinganim() {
    final timer timer = new timer();
    timer.schedule(new timertask() {
      @override
      public void run() {
        mhandle.sendemptymessage(0x0000);
        if (mwaterdrawable.getlevel() >= 10000) {
          timer.cancel();
        }
      }
    }, 0, 50);
    mflameview.startflaming();
    mcoveranim.start();
  }
 
  /*
  重置动画
   */
  public void resetanim() {
    mwaterdrawable.setlevel(0);
    mwaterview.resetbubbleanim();
    mflameview.stopflaming();
    mpea1.setvisibility(invisible);
    mpea2.setvisibility(invisible);
    mpotato.setvisibility(invisible);
    mcarrot.setvisibility(invisible);
    mcoverview.setvisibility(invisible);
 
  }
}

希望本文所述对大家学习android软件编程有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网