Android自定义view仿微信刷新旋转小风车
程序员文章站
2022-03-23 13:49:25
本文实例为大家分享了android仿微信刷新旋转小风车 具体代码,供大家参考,具体内容如下
不太会录像,没办法,智能截图了
不多说了,直接上代码
pack...
本文实例为大家分享了android仿微信刷新旋转小风车 具体代码,供大家参考,具体内容如下
不太会录像,没办法,智能截图了
不多说了,直接上代码
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,所以有点切的不太好,见谅
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。