欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android自定义view仿微信刷新旋转小风车

程序员文章站 2022-03-23 13:49:25
本文实例为大家分享了android仿微信刷新旋转小风车 具体代码,供大家参考,具体内容如下 不太会录像,没办法,智能截图了 不多说了,直接上代码 pack...

本文实例为大家分享了android仿微信刷新旋转小风车 具体代码,供大家参考,具体内容如下

Android自定义view仿微信刷新旋转小风车

不太会录像,没办法,智能截图了

不多说了,直接上代码

package com.shipneg.demoysp.demo;

import android.content.context;
import android.graphics.bitmap;
import android.graphics.canvas;
import android.graphics.matrix;
import android.graphics.paint;
import android.os.countdowntimer;
import android.util.attributeset;
import android.util.log;
import android.view.motionevent;
import android.widget.imageview;

/**
 * created by dell on 2017/4/7.
 */
public class rotationview extends imageview {

 /**
  * 要转动的图片
  **/
 private bitmap bitmap;
 /**
  * 风车每次转动的弧度
  **/
 private int rad = 0;
 /**
  * 风车移动的轨迹
  **/
 private int excursion = -100;
 /**
  * 图片的宽度:在这里提供的是正方形的图片,所以宽度和高度是一样的
  **/
 private int width = 0;
 /***
  * 图片的高度:在这里提供的是正方形的图片,所以宽度和高度是一样的
  **/
 private int height = 0;
 /**
  * 定义一个画笔
  **/
 private paint paint = new paint();


 public rotationview(context context, attributeset attrs) {
  super(context, attrs);
 }

 public rotationview(context context, attributeset attrs, int defstyleattr) {
  super(context, attrs, defstyleattr);
 }

 public rotationview(context context) {
  super(context);
 }

 /**
  * 获取图片的宽和高
  */
 public void initsize() {
  width = bitmap.getwidth();
  height = bitmap.getheight();

  postinvalidate();
 }


 public void setbitmap(bitmap bitmap) {
  this.bitmap = bitmap;
 }


 //一图片的宽和高来设定自定义view的宽和高,由于是正方形宽和高是一样的 
 @override
 protected void onmeasure(int widthmeasurespec, int heightmeasurespec) {
  // todo auto-generated method stub 
  super.onmeasure(widthmeasurespec, heightmeasurespec);
  setmeasureddimension(widthmeasurespec, heightmeasurespec);
 }

 countdowntimer c = new countdowntimer(5000, 10) {
  @override
  public void ontick(long millisuntilfinished) {
   postinvalidate();
   rad = rad + 7;
  }

  @override
  public void onfinish() {
   downy = 0;
   excursion = -100;
   postinvalidate();
  }
 };

 /***
  * 实现ondraw方法把风车图片绘制出来,同时绘制出来风车的旋转效果,通过matrix来控制
  */
 @override
 protected void ondraw(canvas canvas) {

  matrix matrix = new matrix();
  // 设置转轴位置 
  matrix.settranslate((float) width / 2, (float) height / 2);
//  rad -=15;//每次旋转的弧度增量为3当然,数字越大转动越快
  // 开始转 
  matrix.prerotate(rad);
  // 开始平移
  matrix.posttranslate(0, excursion);
  // 转轴还原 
  matrix.pretranslate(-(float) width / 2, -(float) height / 2);
  //绘制风车图片 
  canvas.drawbitmap(bitmap, matrix, paint);

  super.ondraw(canvas);
 }

 private int downy = 0;
 private int movey = 0;
 private int abc = 0;

 @override
 public boolean ontouchevent(motionevent event) {
  int action = event.getaction();
  switch (action) {
   case motionevent.action_down://随着手指的move而不断进行重绘,进而让风车转动起来 
    postinvalidate();//调用方法进行重绘 
    downy = (int) event.gety();
    c.cancel();
    break;

   case motionevent.action_move://随着手指的move而不断进行重绘,进而让风车转动起来 
    //调用方法进行重绘 
    int movey2 = movey;

    rad = (int) -event.gety() * 6;//旋转的速度
    movey = (int) (event.gety() - downy);//手指移动的距离

    int chz = movey - movey2;

    if (chz > 10) {
     chz = chz / 10;
    } else if (chz < -10) {
     chz = chz / 10;
    }
    log.e("tag:" + excursion, "chz: " + chz + "//movey:" + movey + "//movey2:" + movey2);
    //100是向下滑动的最大距离
    if (excursion >= 100) {
     abc = abc + chz;
     if (chz < 0 && abc - chz < 0) {

      excursion = excursion + chz;
     }


    } else {
     //开始向下运动
     excursion += chz;

    }
    postinvalidate();
    c.cancel();
    break;
   case motionevent.action_up:
    c.start();
    break;
  }
  return true;
 }


} 

调用方法

//调用的方法
 rotationview rotation = (rotationview) view.findviewbyid(r.id.rotationview);
  bitmapdrawable drawable = (bitmapdrawable) getresources().getdrawable(r.drawable.fengche);
  rotation.setbitmap(drawable.getbitmap());
  rotation.initsize();

图片资源自己切的,本人不会ps,所以有点切的不太好,见谅

Android自定义view仿微信刷新旋转小风车

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。