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

本文实例为大家分享了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,所以有点切的不太好,见谅

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

(0)

相关推荐

  • Android自定义SwipeRefreshLayout高仿微信朋友圈下拉刷新

    上一篇文章里把SwipeRefreshLayout的原理简单过了一下,大致了解了其工作原理,不熟悉的可以去看一下:http://www.jb51.net/article/89310.htm 上一篇里最后提到,SwipeRefreshLayout的可定制性是比较差的,看源码会发现跟样式相关的几个类都是private的而且方法是写死的,只暴露出了几个颜色设置的方法.这样使得SwipeRefreshLayout的使用比较简单,主要就是设置一个监听器在onRefresh方法里完成刷新逻辑.讲道理Swip

  • Android微信端的下拉刷新功能

    在Android和iOS上对于下拉刷新的处理方法: 在微信公众号内,在面对下拉刷新这个问题上,Android和iOS都自己的表现方式: iOS: Android: 所以我们要给内容加载监听器 function bindEvent() { document.addEventListener('touchstart', touchSatrtFunc, false); document.addEventListener('touchmove', touchMoveFunc, false); docum

  • Android仿微信滑动弹出编辑、删除菜单效果、增加下拉刷新功能

    如何为不同的list item呈现不同的菜单,本文实例就为大家介绍了Android仿微信或QQ滑动弹出编辑.删除菜单效果.增加下拉刷新等功能的实现,分享给大家供大家参考,具体内容如下 效果图: 1. 下载开源项目,并将其中的liberary导入到自己的项目中: 2. 使用SwipeMenuListView代替ListView,在页面中布局: <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefresh

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

    本文实例为大家分享了Android仿微信刷新旋转小风车 具体代码,供大家参考,具体内容如下 不太会录像,没办法,智能截图了 不多说了,直接上代码 package com.shipneg.demoysp.demo; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.

  • Android 自定义view仿微信相机单击拍照长按录视频按钮

    Android仿微信相机的拍照按钮单击拍照,长按录视频.先上效果图. 项目地址:https://github.com/c786909486/PhotoButton2/tree/v1.0 添加依赖 allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { compile compile 'com.github.c786909486:PhotoButton2:v1.1' } 长按效果分

  • Android自定义View仿微信LetterView效果

    废话不多说了,具体代码如下所示: public class LetterView extends View { private String TAG = LetterView.class.getSimpleName(); //A,B,C....Z,# public List<String> letters; private Paint mPaint; private int selectPosition = -1; private TextView mLetter; public void s

  • Android自定义View仿IOS圆盘时间选择器

    通过自定义view实现仿iOS实现滑动两端的点选择时间的效果 效果图 自定义的view代码 public class Ring_Slide2 extends View { private static final double RADIAN = 180 / Math.PI; private int max_progress; // 设置最大进度 private int cur_progress; //设置锚点1当前进度 private int cur_progress2; //设置锚点2进度 p

  • Android自定义View 仿QQ侧滑菜单的实现代码

    先看看QQ的侧滑效果 分析一下 先上原理图(不知道能否表达的清楚 ==) -首先这里使用了 Android 的HorizontalScrollView 水平滑动布局作为容器,当然我们需要继承它自定义一个侧滑视图 - 这个容器里面有一个父布局(一般用LinerLayout,本demo用的是),这个父布局里面有且只有两个子控件(布局),初始状态菜单页的位置在Y轴上存在偏移这样可以就可以形成主页叠在菜单页的上方的视觉效果:然后在滑动的过程程中 逐渐修正偏移,最后菜单页和主页并排排列.原理搞清了实现起来

  • Android自定义View仿支付宝输入六位密码功能

    跟选择银行卡界面类似,也是用一个PopupWindow,不过输入密码界面是一个自定义view,当输入六位密码完成后用回调在Activity中获取到输入的密码并以Toast显示密码.效果图如下: 自定义view布局效果图及代码如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/

  • Android 自定义view仿支付宝咻一咻功能

    支付宝上有一个咻一咻的功能,就是点击图片后四周有水波纹的这种效果,今天也写一个类似的功能. 效果如下所示: 思路: 就是几个圆的半径不断在变大,这个可以使用动画缩放实现,还有透明动画 还有就是这是好几个圆,然后执行的动画有个延迟效果,其实这些动画是放在一起执行的,熟悉属性动画的知道已经给我们提供了同步执行动画和顺序执行动画的实现api,也会会有人说这几个view就是在onDraw()方法中画几个圆,可能会说我还要继承容器view去onLayout()方法中这些子view添加在某个特定的区域,当然

  • Android自定义TextView仿微信朋友圈文字展开全文功能

    Android自定义TextView仿微信朋友圈文字信息,展开全文功能 代码及注释如下: 首先写一个xml文件 showmore.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical

  • Android自定义view仿iOS弹出框效果

    本文实例为大家分享了Android自定义view仿iOS弹出框的具体代码,供大家参考,具体内容如下 运行效果图 自定义对话框的使用,仿照ios.从底部弹出,类似pop窗口.包括消息.图片.列表及对话框. 好了,用法都会,直接贴上代码 1.layout布局文件 view_actionsheet.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="ht

  • Android自定义View仿探探卡片滑动效果

    Android自定义View仿探探卡片滑动这种效果网上有很多人已经讲解了实现思路,大多都用的是RecyclerView来实现的,但是我们今天来换一种实现思路,只用一个自定义的ViewGroup来搞定这个实现. 下面我们先看一下实现的效果: 这个自定义View用法也很简单,首先从github上下载或者fork这个项目,在布局中添加: <com.liyafeng.view.swipecard.SwipeCardLayout android:id="@+id/scl_layout" a

随机推荐