Android特效专辑(九)——仿微信雷达搜索好友特效,逻辑清晰实现简单

不知不觉这个春节也已经过完了,遗憾家里没网,没能及时给大家送上祝福,今天回到深圳,明天就要上班了,小伙伴们是不是和我一样呢?今天讲的是一个大家都见过的动画,雷达搜索好友嘛,原理也十分的简单,你看完我的分析,也会觉得很简单了,国际惯例,无图无真相,我们先看看效果图,对了,真
测试机送人了,所讲这段时间应该一直用模拟器显示吧!

截图

Android特效专辑(九)——仿微信雷达搜索好友特效,逻辑清晰实现简单 - 图1

这个界面相信大家都认识,我们来说下原理,其实就三层

Android特效专辑(九)——仿微信雷达搜索好友特效,逻辑清晰实现简单 - 图2

中间是一张图片,然后画四个圆,这个应该简单吧,不会的可以看下Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解,然后最上面就是一个渐变的圆了,这个圆我们只要让他不停的旋转就可以了,那我们新建一个工程——RadarSearch

Android特效专辑(九)——仿微信雷达搜索好友特效,逻辑清晰实现简单 - 图3

layou_main.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="@drawable/photo" >
  6. <com.lgl.radarsearch.RadarView
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent" />
  9. <ImageView
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:layout_centerInParent="true"
  13. android:src="@drawable/circle_photo" />
  14. </RelativeLayout>

我们新建一个RadarView

RadarView

  1. package com.lgl.radarsearch;
  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.Color;
  5. import android.graphics.Matrix;
  6. import android.graphics.Paint;
  7. import android.graphics.Paint.Style;
  8. import android.graphics.Shader;
  9. import android.graphics.SweepGradient;
  10. import android.os.Handler;
  11. import android.util.AttributeSet;
  12. import android.view.View;
  13. /**
  14. * 雷达搜索
  15. *
  16. * @author LGL
  17. *
  18. */
  19. public class RadarView extends View {
  20. /**
  21. * 思路:我们首先初始化画笔,并且获取到控件的宽高,在onMeasure()中设置铺满,然后在onDraw()方法中绘制四个静态圆和一个渐变圆,
  22. * 我们通过Matrix矩阵来让他不停的旋转就达到我们想要的效果了
  23. */
  24. private Paint mPaintLine, mPaintCircle;
  25. private int w, h;
  26. // 动画
  27. private Matrix matrix;
  28. // 旋转角度
  29. private int start;
  30. // Handler定时动画
  31. private Handler handler = new Handler();
  32. private Runnable run = new Runnable() {
  33. @Override
  34. public void run() {
  35. start = start + 1;
  36. matrix = new Matrix();
  37. // 参数:旋转角度,围绕点坐标的x,y坐标点
  38. matrix.postRotate(start, w / 2, h / 2);
  39. // 刷新重绘
  40. RadarView.this.invalidate();
  41. // 继续循环
  42. handler.postDelayed(run, 60);
  43. }
  44. };
  45. public RadarView(Context context, AttributeSet attrs) {
  46. super(context, attrs);
  47. initView();
  48. // 获取高宽
  49. w = context.getResources().getDisplayMetrics().widthPixels;
  50. h = context.getResources().getDisplayMetrics().heightPixels;
  51. // 一致旋转
  52. handler.post(run);
  53. }
  54. private void initView() {
  55. mPaintLine = new Paint();
  56. mPaintLine.setColor(Color.WHITE);
  57. mPaintLine.setAntiAlias(true);
  58. mPaintLine.setStyle(Style.STROKE);
  59. mPaintCircle = new Paint();
  60. mPaintCircle.setColor(Color.RED);
  61. mPaintCircle.setAntiAlias(true);
  62. matrix = new Matrix();
  63. }
  64. /**
  65. * 测量
  66. *
  67. * @author LGL
  68. */
  69. @Override
  70. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  71. // 设置铺满
  72. setMeasuredDimension(w, h);
  73. }
  74. @Override
  75. protected void onDraw(Canvas canvas) {
  76. super.onDraw(canvas);
  77. // 画四个圆形
  78. canvas.drawCircle(w / 2, h / 2, w / 2, mPaintLine);
  79. canvas.drawCircle(w / 2, h / 2, w / 3, mPaintLine);
  80. canvas.drawCircle(w / 2, h / 2, w * 7 / 10, mPaintLine);
  81. canvas.drawCircle(w / 2, h / 2, w / 4, mPaintLine);
  82. // 绘制渐变圆
  83. Shader mShader = new SweepGradient(w / 2, h / 2, Color.TRANSPARENT,
  84. Color.parseColor("#AAAAAAAA"));
  85. // 绘制时渐变
  86. mPaintCircle.setShader(mShader);
  87. // 增加旋转动画,使用矩阵实现
  88. canvas.concat(matrix); // 前置动画
  89. canvas.drawCircle(w / 2, h / 2, w * 7 / 10, mPaintCircle);
  90. }
  91. }

Demo下载地址:http://download.csdn.net/detail/qq_26787115/9430942