日期:2019.5.11

博客期:077

星期六

  

    这都已经第七天了,我好像还没有把这个雷达搞定好!嗯~~~怎么它就是不出来呢?

    我把昨天代码里的LogUntils和DisplayUntils当作一个新的Java类,进行了详细的琢磨,我发现这个LogUntil就是一个消息传递的表现手法,而另一个则是长度转换的工具!

    明天要去西柏坡社会实践,所以应该是不会有太大的进度的,今天做的也不是很多!

    代码如下:    

  1 package basic;
  2
  3 import android.content.Context;
  4 import android.graphics.Bitmap;
  5 import android.graphics.BitmapFactory;
  6 import android.graphics.Canvas;
  7 import android.graphics.Paint;
  8 import android.graphics.Rect;
  9 import android.util.AttributeSet;
 10 import android.view.View;
 11
 12 import com.example.radar.R;
 13
 14 public class CircleView extends View {
 15     private Paint mPaint;
 16     private Bitmap mBitmap;
 17     private float radius = DisplayUtils.dp2px(getContext(),9);//半径
 18     private float disX;//位置X
 19     private float disY;//位置Y
 20     private float angle;//旋转的角度
 21     private float proportion;//根据远近距离的不同计算得到的应该占的半径比例
 22
 23     public float getProportion() {
 24         return proportion;
 25     }
 26
 27     public void setProportion(float proportion) {
 28         this.proportion = proportion;
 29     }
 30
 31     public float getAngle() {
 32         return angle;
 33     }
 34
 35     public void setAngle(float angle) {
 36         this.angle = angle;
 37     }
 38
 39     public float getDisX() {
 40         return disX;
 41     }
 42
 43     public void setDisX(float disX) {
 44         this.disX = disX;
 45     }
 46
 47     public float getDisY() {
 48         return disY;
 49     }
 50
 51     public void setDisY(float disY) {
 52         this.disY = disY;
 53     }
 54
 55     public CircleView(Context context) {
 56         this(context, null);
 57     }
 58
 59     public CircleView(Context context, AttributeSet attrs) {
 60         this(context, attrs, 0);
 61     }
 62
 63     public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
 64         super(context, attrs, defStyleAttr);
 65         init();
 66     }
 67
 68     private void init() {
 69         mPaint = new Paint();
 70         mPaint.setColor(getResources().getColor(R.color.bg_color_pink));
 71         mPaint.setAntiAlias(true);
 72     }
 73
 74     @Override
 75     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 76         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 77         setMeasuredDimension(measureSize(widthMeasureSpec), measureSize(heightMeasureSpec));
 78     }
 79
 80     private int measureSize(int measureSpec) {
 81         int result = 0;
 82         int specMode = MeasureSpec.getMode(measureSpec);
 83         int specSize = MeasureSpec.getSize(measureSpec);
 84         if (specMode == MeasureSpec.EXACTLY) {
 85             result = specSize;
 86         } else {
 87             result = (int)DisplayUtils.dp2px(getContext(),18);
 88             if (specMode == MeasureSpec.AT_MOST) {
 89                 result = Math.min(result, specSize);
 90             }
 91         }
 92         return result;
 93     }
 94
 95
 96     @Override
 97     protected void onDraw(Canvas canvas) {
 98         canvas.drawCircle(radius, radius, radius, mPaint);
 99         if (mBitmap != null) {
100             canvas.drawBitmap(mBitmap, null, new Rect(0, 0, 2 * (int) radius, 2 * (int) radius), mPaint);
101         }
102     }
103
104     public void setPaintColor(int resId) {
105         mPaint.setColor(resId);
106         invalidate();
107     }
108
109     public void setPortraitIcon(int resId) {
110         mBitmap = BitmapFactory.decodeResource(getResources(), resId);
111         invalidate();
112     }
113     public void clearPortaitIcon(){
114         mBitmap = null;
115         invalidate();
116     }
117 }

CircleView.java

 1 package basic;
 2
 3 import android.content.Context;
 4 import android.support.v4.view.ViewPager;
 5 import android.util.AttributeSet;
 6 import android.view.MotionEvent;
 7
 8 public class CustomViewPager extends ViewPager {
 9     private long downTime;
10     private float LastX;
11     private float mSpeed;
12
13     public CustomViewPager(Context context) {
14         super(context);
15     }
16
17     public CustomViewPager(Context context, AttributeSet attrs) {
18         super(context, attrs);
19     }
20
21     @Override
22     public boolean dispatchTouchEvent(MotionEvent ev) {
23         float x = ev.getX();
24         switch (ev.getAction()) {
25             case MotionEvent.ACTION_DOWN:
26                 downTime = System.currentTimeMillis();
27                 LastX = x;
28                 break;
29             case MotionEvent.ACTION_MOVE:
30                 x = ev.getX();
31                 break;
32             case MotionEvent.ACTION_UP:
33                 //计算得到手指从按下到离开的滑动速度
34                 mSpeed = (x - LastX) * 1000 / (System.currentTimeMillis() - downTime);
35                 break;
36         }
37         return super.dispatchTouchEvent(ev);
38     }
39
40     public float getSpeed() {
41         return mSpeed;
42     }
43
44     public void setSpeed(float mSpeed) {
45         this.mSpeed = mSpeed;
46     }
47 }

CustomViewPager.java

 1 package basic;
 2
 3 import android.app.Activity;
 4 import android.content.Context;
 5 import android.util.DisplayMetrics;
 6
 7 /** * dp、sp 转换为 px 的工具类 * * Created by sunfusheng on 16/5/31. */
 8 public class DisplayUtils {
 9     // 将px值转换为dip或dp值,保证尺寸大小不变
10     public static int px2dip(Context context, float pxValue) {
11         final float scale = context.getResources().getDisplayMetrics().density;
12         return (int) (pxValue / scale + 0.5f);
13     }
14     // 将dip或dp值转换为px值,保证尺寸大小不变
15     public static int dip2px(Context context, float dipValue) {
16         final float scale = context.getResources().getDisplayMetrics().density;
17         return (int) (dipValue * scale + 0.5f);
18     }
19     // 将px值转换为sp值,保证文字大小不变
20     public static int px2sp(Context context, float pxValue) {
21         final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
22         return (int) (pxValue / fontScale + 0.5f);
23     }
24     // 将sp值转换为px值,保证文字大小不变
25     public static int sp2px(Context context, float spValue) {
26         final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
27         return (int) (spValue * fontScale + 0.5f);
28     }
29     // 屏幕宽度(像素)
30     public static int getWindowWidth(Activity context) {
31         DisplayMetrics metric = new DisplayMetrics();
32         context.getWindowManager().getDefaultDisplay().getMetrics(metric);
33         return metric.widthPixels;
34     }
35     // 屏幕高度(像素)
36     public static int getWindowHeight(Activity context) {
37         DisplayMetrics metric = new DisplayMetrics();
38         context.getWindowManager().getDefaultDisplay().getMetrics(metric);
39         return metric.heightPixels;
40     }
41
42     public static float dp2px(Context context, int i) {
43         return dip2px(context,i);
44     }
45 }

DisplayUtils.java

 1 package basic;
 2
 3 import android.content.Context;
 4
 5 import android.view.animation.Interpolator;
 6 import android.widget.Scroller;
 7
 8 public class FixedSpeedScroller extends Scroller {
 9     private int mDuration = 0;
10     public FixedSpeedScroller(Context context) {
11         super(context);
12     }
13     public FixedSpeedScroller(Context context, Interpolator interpolator) {
14         super(context, interpolator);
15     }
16     public FixedSpeedScroller(Context context, Interpolator interpolator, boolean flywheel) {
17         super(context, interpolator, flywheel);
18     }
19     @Override
20     public void startScroll(int startX, int startY, int dx, int dy, int duration) {
21         super.startScroll(startX, startY, dx, dy, mDuration);
22     }
23     @Override
24     public void startScroll(int startX, int startY, int dx, int dy) {
25         super.startScroll(startX, startY, dx, dy, mDuration);
26     }
27
28     public void setmDuration(int duration) {
29         mDuration = duration;
30     }
31 }

FixedSpeedScroller.java

 1 package basic;
 2
 3 public class Info {
 4     private int portraitId;//头像id
 5     private String name;//名字
 6     private String age;//年龄
 7     private boolean sex;//false为男,true为女
 8     private float distance;//距离
 9     private String password;//密码
10
11     public int getPortraitId() {
12         return portraitId;
13     }
14
15     public void setPortraitId(int portraitId) {
16         this.portraitId = portraitId;
17     }
18     public void setPassword(String password){
19         this.password = password;
20     }
21     public String getPassword() {
22         return password;
23     }
24
25     public String getAge() {
26         return age;
27     }
28
29     public void setAge(String age) {
30         this.age = age;
31     }
32
33     public float getDistance() {
34         return distance;
35     }
36
37     public void setDistance(float distance) {
38         this.distance = distance;
39     }
40
41     public String getName() {
42         return name;
43     }
44
45     public void setName(String name) {
46         this.name = name;
47     }
48
49     public boolean getSex() {
50         return sex;
51     }
52
53     public void setSex(boolean sex) {
54         this.sex = sex;
55     }
56 }

Info.java

 1 package basic;
 2
 3 import android.util.Log;
 4
 5 /**
 6  * Used 实现自由的控制日志的打印--《第一行代码》 郭霖
 7  * 只有当LEVEL常量的值大于或等于对应日志级别值的时候,才会打印日志。
 8  * 开发阶段,将LEVEL赋值为VERBOSE,上线阶段将LEVEL赋值为NOTHING
 9  */
10 public class LogUtil {
11     public static final int VERBOSE = 1;
12     public static final int DEBUG = 2;
13     public static final int INFO = 3;
14     public static final int WARN = 4;
15     public static final int ERROR = 5;
16     public static final int NOTHING = 6;
17     /**控制想要打印的日志级别
18      * 等于VERBOSE,则就会打印所有级别的日志
19      * 等于WARN,则只会打印警告级别以上的日志
20      * 等于NOTHING,则会屏蔽掉所有日志*/
21     public static final int LEVEL = VERBOSE;
22
23
24     public static void v(String tag, String msg){
25         if(LEVEL <= VERBOSE){
26             Log.v(tag, msg);
27         }
28     }
29
30     public static void d(String tag, String msg){
31         if(LEVEL <= DEBUG){
32             Log.d(tag, msg);
33         }
34     }
35
36     public static void i(String tag, String msg){
37         if(LEVEL <= INFO){
38             Log.i(tag, msg);
39         }
40     }
41
42     public static void w(String tag, String msg){
43         if(LEVEL <= WARN){
44             Log.w(tag, msg);
45         }
46     }
47
48     public static void e(String tag, String msg){
49         if(LEVEL <= ERROR){
50             Log.e(tag, msg);
51         }
52     }
53
54     public static void m(String tag) {
55         if(LEVEL <= NOTHING)
56             Log.i(tag,"");
57     }
58 }

LogUtil.java

  1 package basic;
  2
  3 import android.content.Context;
  4 import android.graphics.Bitmap;
  5 import android.graphics.BitmapFactory;
  6 import android.graphics.Canvas;
  7 import android.graphics.Color;
  8 import android.graphics.Matrix;
  9 import android.graphics.Paint;
 10 import android.graphics.Rect;
 11 import android.graphics.Shader;
 12 import android.graphics.SweepGradient;
 13 import android.util.AttributeSet;
 14 import android.view.View;
 15
 16 import com.example.radar.R;
 17
 18 public class RadarView extends View {
 19     private Paint mPaintLine;//画圆线需要用到的paint
 20     private Paint mPaintCircle;//画圆需要用到的paint
 21     private Paint mPaintScan;//画扫描需要用到的paint
 22
 23     private int mWidth, mHeight;//整个图形的长度和宽度
 24
 25     private Matrix matrix = new Matrix();//旋转需要的矩阵
 26     private int scanAngle;//扫描旋转的角度
 27     private Shader scanShader;//扫描渲染shader
 28     private Bitmap centerBitmap;//最中间icon
 29
 30     //每个圆圈所占的比例
 31     private static float[] circleProportion = {1 / 13f, 2 / 13f, 3 / 13f, 4 / 13f, 5 / 13f, 6 / 13f};
 32     private int scanSpeed = 5;
 33
 34     private int currentScanningCount;//当前扫描的次数
 35     private int currentScanningItem;//当前扫描显示的item
 36     private int maxScanItemCount;//最大扫描次数
 37     private boolean startScan = false;//只有设置了数据后才会开始扫描
 38     private IScanningListener iScanningListener;//扫描时监听回调接口
 39
 40     public void setScanningListener(IScanningListener iScanningListener) {
 41         this.iScanningListener = iScanningListener;
 42     }
 43
 44     private Runnable run = new Runnable() {
 45         @Override
 46         public void run() {
 47             scanAngle = (scanAngle + scanSpeed) % 360;
 48             matrix.postRotate(scanSpeed, mWidth / 2, mHeight / 2);
 49             invalidate();
 50             postDelayed(run, 130);
 51             //开始扫描显示标志为true 且 只扫描一圈
 52             if (startScan && currentScanningCount <= (360 / scanSpeed)) {
 53                 if (iScanningListener != null && currentScanningCount % scanSpeed == 0
 54                         && currentScanningItem < maxScanItemCount) {
 55
 56                     iScanningListener.onScanning(currentScanningItem, scanAngle);
 57                     currentScanningItem++;
 58                 } else if (iScanningListener != null && currentScanningItem == maxScanItemCount) {
 59                     iScanningListener.onScanSuccess();
 60                 }
 61                 currentScanningCount++;
 62             }
 63         }
 64     };
 65
 66     public RadarView(Context context) {
 67         this(context, null);
 68     }
 69
 70     public RadarView(Context context, AttributeSet attrs) {
 71         this(context, attrs, 0);
 72     }
 73
 74     public RadarView(Context context, AttributeSet attrs, int defStyleAttr) {
 75         super(context, attrs, defStyleAttr);
 76         init();
 77         post(run);
 78     }
 79
 80
 81     private void init() {
 82         mPaintLine = new Paint();
 83         mPaintLine.setColor(getResources().getColor(R.color.line_color_blue));
 84         mPaintLine.setAntiAlias(true);
 85         mPaintLine.setStrokeWidth(1);
 86         mPaintLine.setStyle(Paint.Style.STROKE);
 87
 88         mPaintCircle = new Paint();
 89         mPaintCircle.setColor(Color.WHITE);
 90         mPaintCircle.setAntiAlias(true);
 91
 92         mPaintScan = new Paint();
 93         mPaintScan.setStyle(Paint.Style.FILL_AND_STROKE);
 94     }
 95
 96     @Override
 97     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 98         setMeasuredDimension(measureSize(widthMeasureSpec), measureSize(widthMeasureSpec));
 99         mWidth = getMeasuredWidth();
100         mHeight = getMeasuredHeight();
101         mWidth = mHeight = Math.min(mWidth, mHeight);
102         centerBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.circle_photo);
103         //设置扫描渲染的shader
104         scanShader = new SweepGradient(mWidth / 2, mHeight / 2,
105                 new int[]{Color.TRANSPARENT, Color.parseColor("#84B5CA")}, null);
106     }
107
108     private int measureSize(int measureSpec) {
109         int result = 0;
110         int specMode = MeasureSpec.getMode(measureSpec);
111         int specSize = MeasureSpec.getSize(measureSpec);
112         if (specMode == MeasureSpec.EXACTLY) {
113             result = specSize;
114         } else {
115             result = 300;
116             if (specMode == MeasureSpec.AT_MOST) {
117                 result = Math.min(result, specSize);
118             }
119         }
120         return result;
121     }
122
123     @Override
124     protected void onDraw(Canvas canvas) {
125         drawCircle(canvas);
126         drawScan(canvas);
127         drawCenterIcon(canvas);
128     }
129
130     /**
131      * 绘制圆线圈
132      *
133      * @param canvas
134      */
135     private void drawCircle(Canvas canvas) {
136         canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth * circleProportion[1], mPaintLine);     // 绘制小圆
137         canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth * circleProportion[2], mPaintLine);   // 绘制中圆
138         canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth * circleProportion[3], mPaintLine); // 绘制中大圆
139         canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth * circleProportion[4], mPaintLine);  // 绘制大圆
140         canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth * circleProportion[5], mPaintLine);  // 绘制大大圆
141     }
142
143     /**
144      * 绘制扫描
145      *
146      * @param canvas
147      */
148     private void drawScan(Canvas canvas) {
149         canvas.save();
150         mPaintScan.setShader(scanShader);
151         canvas.concat(matrix);
152         canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth * circleProportion[4], mPaintScan);
153         canvas.restore();
154     }
155
156     /**
157      * 绘制最中间的图标
158      *
159      * @param canvas
160      */
161     private void drawCenterIcon(Canvas canvas) {
162         canvas.drawBitmap(centerBitmap, null,
163                 new Rect((int) (mWidth / 2 - mWidth * circleProportion[0]), (int) (mHeight / 2 - mWidth * circleProportion[0]),
164                         (int) (mWidth / 2 + mWidth * circleProportion[0]), (int) (mHeight / 2 + mWidth * circleProportion[0])), mPaintCircle);
165     }
166
167
168     public interface IScanningListener {
169         //正在扫描(此时还没有扫描完毕)时回调
170         void onScanning(int position, float scanAngle);
171
172         //扫描成功时回调
173         void onScanSuccess();
174     }
175
176     public void setMaxScanItemCount(int maxScanItemCount) {
177         this.maxScanItemCount = maxScanItemCount;
178     }
179
180     /**
181      * 开始扫描
182      */
183     public void startScan() {
184         this.startScan = true;
185     }
186 }

RadarView.java

  1 package basic;
  2
  3 import android.animation.ObjectAnimator;
  4 import android.content.Context;
  5 import android.util.AttributeSet;
  6 import android.util.SparseArray;
  7 import android.view.View;
  8 import android.view.ViewGroup;
  9
 10 import com.example.radar.R;
 11
 12 public class RadarViewGroup extends ViewGroup implements RadarView.IScanningListener {
 13     private int mWidth, mHeight;//viewgroup的宽高
 14     private SparseArray<Float> scanAngleList = new SparseArray<>();//记录展示的item所在的扫描位置角度
 15     private SparseArray<Info> mDatas;//数据源
 16     private int dataLength;//数据源长度
 17     private int minItemPosition;//最小距离的item所在数据源中的位置
 18     private CircleView currentShowChild;//当前展示的item
 19     private CircleView minShowChild;//最小距离的item
 20     private IRadarClickListener iRadarClickListener;//雷达图中点击监听CircleView小圆点回调接口
 21
 22     public void setiRadarClickListener(IRadarClickListener iRadarClickListener) {
 23         this.iRadarClickListener = iRadarClickListener;
 24     }
 25
 26     public RadarViewGroup(Context context) {
 27         this(context, null);
 28     }
 29
 30     public RadarViewGroup(Context context, AttributeSet attrs) {
 31         this(context, attrs, 0);
 32     }
 33
 34     public RadarViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
 35         super(context, attrs, defStyleAttr);
 36     }
 37
 38
 39     @Override
 40     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 41         setMeasuredDimension(measureSize(widthMeasureSpec), measureSize(heightMeasureSpec));
 42         mWidth = getMeasuredWidth();
 43         mHeight = getMeasuredHeight();
 44         mWidth = mHeight = Math.min(mWidth, mHeight);
 45         //测量每个children
 46         measureChildren(widthMeasureSpec, heightMeasureSpec);
 47         for (int i = 0; i < getChildCount(); i++) {
 48             View child = getChildAt(i);
 49             if (child.getId() == R.id.id_scan_circle) {
 50                 //为雷达扫描图设置需要的属性
 51                 ((RadarView) child).setScanningListener(this);
 52                 //考虑到数据没有添加前扫描图在扫描,但是不会开始为CircleView布局
 53                 if (mDatas != null && mDatas.size() > 0) {
 54                     ((RadarView) child).setMaxScanItemCount(mDatas.size());
 55                     ((RadarView) child).startScan();
 56                 }
 57                 continue;
 58             }
 59         }
 60     }
 61
 62     @Override
 63     protected void onLayout(boolean changed, int l, int t, int r, int b) {
 64         int childCount = getChildCount();
 65         //首先放置雷达扫描图
 66         View view = findViewById(R.id.id_scan_circle);
 67         if (view != null) {
 68             view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
 69         }
 70         //放置雷达图中需要展示的item圆点
 71         for (int i = 0; i < childCount; i++) {
 72             final int j = i;
 73             final View child = getChildAt(i);
 74             if (child.getId() == R.id.id_scan_circle) {
 75                 //如果不是Circleview跳过
 76                 continue;
 77             }
 78             //设置CircleView小圆点的坐标信息
 79             //坐标 = 旋转角度 * 半径 * 根据远近距离的不同计算得到的应该占的半径比例
 80             ((CircleView) child).setDisX((float) Math.cos(Math.toRadians(scanAngleList.get(i - 1) - 5))
 81                     * ((CircleView) child).getProportion() * mWidth / 2);
 82             ((CircleView) child).setDisY((float) Math.sin(Math.toRadians(scanAngleList.get(i - 1) - 5))
 83                     * ((CircleView) child).getProportion() * mWidth / 2);
 84             //如果扫描角度记录SparseArray中的对应的item的值为0,
 85             // 说明还没有扫描到该item,跳过对该item的layout
 86             //(scanAngleList设置数据时全部设置的value=0,
 87             // 当onScanning时,value设置的值始终不会0,具体可以看onScanning中的实现)
 88             if (scanAngleList.get(i - 1) == 0) {
 89                 continue;
 90             }
 91             //放置Circle小圆点
 92             child.layout((int) ((CircleView) child).getDisX() + mWidth / 2, (int) ((CircleView) child).getDisY() + mHeight / 2,
 93                     (int) ((CircleView) child).getDisX() + child.getMeasuredWidth() + mWidth / 2,
 94                     (int) ((CircleView) child).getDisY() + child.getMeasuredHeight() + mHeight / 2);
 95             //设置点击事件
 96             child.setOnClickListener(new OnClickListener() {
 97                 @Override
 98                 public void onClick(View v) {
 99                     resetAnim(currentShowChild);
100                     currentShowChild = (CircleView) child;
101                     //因为雷达图是childAt(0),所以这里需要作-1才是正确的Circle
102                     startAnim(currentShowChild, j - 1);
103                     if (iRadarClickListener != null) {
104                         iRadarClickListener.onRadarItemClick(j - 1);
105
106                     }
107                 }
108             });
109         }
110
111
112     }
113
114     private int measureSize(int measureSpec) {
115         int result = 0;
116         int specMode = MeasureSpec.getMode(measureSpec);
117         int specSize = MeasureSpec.getSize(measureSpec);
118         if (specMode == MeasureSpec.EXACTLY) {
119             result = specSize;
120         } else {
121             result = 300;
122             if (specMode == MeasureSpec.AT_MOST) {
123                 result = Math.min(result, specSize);
124             }
125         }
126         return result;
127
128     }
129
130     /**
131      * 设置数据
132      *
133      * @param mDatas
134      */
135     public void setDatas(SparseArray<Info> mDatas) {
136         this.mDatas = mDatas;
137         dataLength = mDatas.size();
138         float min = Float.MAX_VALUE;
139         float max = Float.MIN_VALUE;
140         //找到距离的最大值,最小值对应的minItemPosition
141         for (int j = 0; j < dataLength; j++) {
142             Info item = mDatas.get(j);
143             if (item.getDistance() < min) {
144                 min = item.getDistance();
145                 minItemPosition = j;
146             }
147             if (item.getDistance() > max) {
148                 max = item.getDistance();
149             }
150             scanAngleList.put(j, 0f);
151         }
152         //根据数据源信息动态添加CircleView
153         for (int i = 0; i < dataLength; i++) {
154             CircleView circleView = new CircleView(getContext());
155             if (mDatas.get(i).getSex()) {
156                 circleView.setPaintColor(getResources().getColor(R.color.bg_color_pink));
157             } else {
158                 circleView.setPaintColor(getResources().getColor(R.color.bg_color_blue));
159             }
160             //根据远近距离的不同计算得到的应该占的半径比例 0.312-0.832
161             circleView.setProportion((mDatas.get(i).getDistance() / max + 0.6f) * 0.52f);
162             if (minItemPosition == i) {
163                 minShowChild = circleView;
164             }
165             addView(circleView);
166         }
167     }
168
169     /**
170      * 雷达图没有扫描完毕时回调
171      *
172      * @param position
173      * @param scanAngle
174      */
175     @Override
176     public void onScanning(int position, float scanAngle) {
177         if (scanAngle == 0) {
178             scanAngleList.put(position, 1f);
179         } else {
180             scanAngleList.put(position, scanAngle);
181         }
182         requestLayout();
183     }
184
185     /**
186      * 雷达图扫描完毕时回调
187      */
188     @Override
189     public void onScanSuccess() {
190         LogUtil.m("完成回调");
191         resetAnim(currentShowChild);
192         currentShowChild = minShowChild;
193         startAnim(currentShowChild, minItemPosition);
194     }
195
196     /**
197      * 恢复CircleView小圆点原大小
198      *
199      * @param object
200      */
201     private void resetAnim(CircleView object) {
202         if (object != null) {
203             object.clearPortaitIcon();
204             ObjectAnimator.ofFloat(object, "scaleX", 1f).setDuration(300).start();
205             ObjectAnimator.ofFloat(object, "scaleY", 1f).setDuration(300).start();
206         }
207
208     }
209
210     /**
211      * 放大CircleView小圆点大小
212      *
213      * @param object
214      * @param position
215      */
216     private void startAnim(CircleView object, int position) {
217         if (object != null) {
218             object.setPortraitIcon(mDatas.get(position).getPortraitId());
219             ObjectAnimator.ofFloat(object, "scaleX", 2f).setDuration(300).start();
220             ObjectAnimator.ofFloat(object, "scaleY", 2f).setDuration(300).start();
221         }
222     }
223
224     /**
225      * 雷达图中点击监听CircleView小圆点回调接口
226      */
227     public interface IRadarClickListener {
228         void onRadarItemClick(int position);
229     }
230
231     /**
232      * 根据position,放大指定的CircleView小圆点
233      *
234      * @param position
235      */
236     public void setCurrentShowItem(int position) {
237         CircleView child = (CircleView) getChildAt(position + 1);
238         resetAnim(currentShowChild);
239         currentShowChild = child;
240         startAnim(currentShowChild, position);
241     }
242 }

RadarViewGroup.java

 1 package basic;
 2
 3 import android.support.v4.view.PagerAdapter;
 4 import android.view.LayoutInflater;
 5 import android.view.View;
 6 import android.view.ViewGroup;
 7 import android.widget.ImageView;
 8 import android.widget.TextView;
 9 import android.widget.Toast;
10
11 import com.example.radar.R;
12
13 import java.util.List;
14
15 public class ViewpagerAdapter extends PagerAdapter {
16     private List<Info> mDatas;
17     //private Object mImgs;
18
19     @Override
20     public Object instantiateItem(final ViewGroup container, final int position) {
21
22         final Info info = mDatas.get(position);
23         //设置一大堆演示用的数据,麻里麻烦~~
24         View view = LayoutInflater.from(container.getContext()).inflate(R.layout.viewpager_layout, null);
25         ImageView ivPortrait = (ImageView) view.findViewById(R.id.iv);
26         ImageView ivSex = (ImageView) view.findViewById(R.id.iv_sex);
27         TextView tvName = (TextView) view.findViewById(R.id.tv_name);
28         TextView tvDistance = (TextView) view.findViewById(R.id.tv_distance);
29         tvName.setText(info.getName());
30         tvDistance.setText(info.getDistance() + "km");
31         ivPortrait.setImageResource(info.getPortraitId());
32         if (info.getSex()) {
33             ivSex.setImageResource(R.drawable.girl);
34         } else {
35             ivSex.setImageResource(R.drawable.boy);
36         }
37         ivPortrait.setOnClickListener(new View.OnClickListener() {
38             @Override
39             public void onClick(View v) {
40                 Toast.makeText(container.getContext() , "这是 " + info.getName() + " >.<", Toast.LENGTH_SHORT).show();
41             }
42         });
43         container.addView(view);
44         return view;
45     }
46
47     @Override
48     public int getCount() {
49         return mDatas.size();//mImgs.length;
50     }
51
52     @Override
53     public boolean isViewFromObject(View view, Object object) {
54         return view == object;
55     }
56
57     @Override
58     public void destroyItem(ViewGroup container, int position, Object object) {
59         View view = (View) object;
60         container.removeView(view);
61     }
62
63 }

ViewpagerAdapter.java

 1 package basic;
 2
 3 import android.support.v4.view.ViewPager;
 4 import android.view.View;
 5
 6 public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
 7     private static final float MIN_SCALE = 0.70f;
 8     private static final float MIN_ALPHA = 0.5f;
 9
10     public void transformPage(View view, float position) {
11         int pageWidth = view.getWidth();
12         int pageHeight = view.getHeight();
13         if (position < -1) { // [-Infinity,-1)
14             // This page is way off-screen to the left.
15             view.setAlpha(MIN_ALPHA);
16             view.setScaleX(MIN_SCALE);
17             view.setScaleY(MIN_SCALE);
18         } else if (position <= 1) { // [-1,1]
19             // Modify the default slide transition to shrink the page as well
20             float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
21             float vertMargin = pageHeight * (1 - scaleFactor) / 2;
22             float horzMargin = pageWidth * (1 - scaleFactor) / 2;
23             if (position < 0) {
24                 view.setTranslationX(horzMargin - vertMargin / 2);
25                 view.setScaleX(1 + 0.3f * position);
26                 view.setScaleY(1 + 0.3f * position);
27             } else {
28                 view.setTranslationX(-horzMargin + vertMargin / 2);
29
30                 view.setScaleX(1 - 0.3f * position);
31                 view.setScaleY(1 - 0.3f * position);
32             }
33
34             // Scale the page down (between MIN_SCALE and 1)
35
36             // Fade the page relative to its size.
37             view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA));
38
39         } else { // (1,+Infinity]
40             // This page is way off-screen to the right.
41             view.setScaleX(MIN_SCALE);
42             view.setScaleY(MIN_SCALE);
43             view.setAlpha(MIN_ALPHA);
44         }
45     }
46 }

ZoomOutPageTransformer.java

    

转载于:https://www.cnblogs.com/onepersonwholive/p/10873431.html

星辰小队针对于软件“星遇”的10天冲刺——第7天相关推荐

  1. 星辰小队针对于软件“星遇”的第二次10天冲刺——第3天

    日期:2019.5.30 博客期:089 星期四 今天终终终终终终终终终终终终终终终终终终终终终于找到了可以使用的能够调用的方法了,因为之前使用的Activity,Activity里面的传值方式有很大 ...

  2. 星辰小队针对于软件“星遇”的第二次10天冲刺——第2天

    日期:2019.5.29 博客期:087 星期三 今天从网上找了很多的实用性代码,但是要读懂他们谈何容易?我根据之前学到的有关Android的知识,改变了内部结构!根据XML文件的设定我找了很多的博客 ...

  3. 揭榜|2022年度“博客之星新星”TOP 10已出炉

    目录 「博客之星」TOP 10 「博客新星」TOP 10 评选说明 奖品说明 奖项及奖品 地址填写说明 奖品发放时间说明 2022 年度博客之星活动官网:https://www.csdn.net/bl ...

  4. 提升软件开发者效率的10个提示

    Ilias Tsagklis是电信领域的一位资深软件工程师,以软件开发者的身份参与了多个应用与服务的开发工作.目前,Ilias是PCRF解决方案的技术领导者.他感兴趣的领域包括多层架构.中间件服务及移 ...

  5. 很多工控产品都在用的 CODESYS 软件中被曝10个严重漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士 俄罗斯网络安全公司 Positive Technologies 的研究人员从很多款工控产品都在使用的 CODESYS 工业自动化软件中发现 ...

  6. 成功的软件工程师共有的10个习惯和技能

    又看到一篇关于方法论的文章,观点还是不错的.翻译出来,分享给大家.如果有一项启发了你,那恭喜你.以下为正文内容: 就像没有两片相同的雪花一样,程序员也各有不同.每一片雪花都是由不同原子以独特的结构构成 ...

  7. 贵金属实时行情看盘软件排行榜(top 10)

    贵金属实时行情看盘软件哪个好,还是得看MT4软件,MT4是俄罗斯软件公司MetaQuotes生产的一款以外汇和贵金属交易为主的软件,其功能十分全面,目前全球有超过100家贵金属公司和30个国家的银行选 ...

  8. 软件设计师考试笔记-(10)

    软件设计师考试笔记-(10) 1.操作系统基本原理 1.1.进程管理 1.1.1.进程状态 1.1.2.前趋图 为了描述一个程序的各部分间的依赖关系,或者是一个大的计算的各个子任务间的因果关系的图示. ...

  9. 梦幻星辰服务器网站,我的世界1.7.10梦幻星辰

    我的世界1.7.10梦幻星辰是一款非常好玩的神奇宝贝魔幻服务器,这款服务器的规模还是比较大的,玩家也可以在这里自由发挥,这里是一个梦幻的世界,有着大型的神奇宝贝俱乐部,玩家还可以在这里做任务来获取一些 ...

最新文章

  1. 总量迈过90万亿元关口 中国经济交出稳健答卷
  2. kingshard--一个支持sharding的MySQL Proxy项目
  3. python基础教程:变量的使用
  4. 百度 Serverless 函数计算引擎 EasyFaaS 正式开源
  5. 算法面试:栈实现队列的方案
  6. python 温度 符号_Python通过小实例入门学习---1.0(温度转换)
  7. 36数字在排序数组中出现的次数
  8. Python基础——pickle(保存与提取数据)
  9. LeetCode 303. 区域和检索 - 数组不可变(动态规划)
  10. Disk Expert Pro for Mac(磁盘分析管理工具)
  11. 二十四、JAVA集合框架(四)
  12. 电路基础之:差模信号与共模信号
  13. ap位置服务器怎么找,如何正确选择无线AP的安装位置?
  14. 【CS229笔记】协方差矩阵概念快速回顾
  15. GNSS抗干扰和GNSS抗欺骗
  16. Python学习中的错误总结
  17. arm架构服务器安装系统教程,docker服务在arm平台上部署安装方法
  18. C:exit(0),_exit(0),exit(1),exit(-1)作用与区别
  19. 机器学习的最佳入门学习资源
  20. NodeMCU文档中文翻译 5 上传代码

热门文章

  1. AWS 服务器登录和配置
  2. Access denied for user ‘user‘@‘%‘ to database 可能的原因
  3. 计算机上的be无法正常启动,应用程序无法正常启动0xc0000005的三种解决方法
  4. java 获取图片像素_转:java提取图片中的像素
  5. More Effective C++之 Item M35:让自己习惯使用标准C++语言
  6. mysql数据库中到底能建多少张表?(单实例下单个库)
  7. 对言语上的自律和真正的自律的一些想法
  8. JVM对象创建与内存分配机制学习总结
  9. 迷宫求解【穷举求解法】
  10. 原生JS实现轮播图 方法总结