Android 雷达扫描效果、动画SweepGradient

来源:互联网 发布:淘宝psv揽货 编辑:程序博客网 时间:2024/04/28 03:19

摘要:

      今天群里(QQ群64026923)的同学在讨论雷达的效果怎么实现,机智的小伙伴们马上想到让美工切图,然后再给图片做动画不就行了吗???确实这个方法也不错,那么还有没有其他的方法呢?先来看看效果图:

API分析

      SweepGradient扫描/梯度渲染, 

public SweepGradient(float cx, float cy, int[] colors, float[] positions)

Parameters:
cx渲染中心点x 坐标cy渲染中心y 点坐标colors围绕中心渲染的颜色数组,至少要有两种颜色值positions相对位置的颜色数组,可为null,  若为null,可为null,颜色沿渐变线均匀分布


public SweepGradient(float cx, float cy, int color0, int color1)

Parameters:
cx渲染中心点x 坐标cy渲染中心点y 坐标color0起始渲染颜色color1结束渲染颜色

效果实现:

import java.util.ArrayList;import java.util.Random;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Shader;import android.graphics.SweepGradient;import android.util.AttributeSet;import android.view.View;import android.widget.FrameLayout;/** * SweepGradient扫描/梯度渲染 * @author mick * */public class RadaView extends FrameLayout {private int viewSize = 800;private Paint mPaintLine;private Paint mPaintSector;  // 扫描效果的画笔public boolean isstart = false;private ScanThread mThread;  // 扫描的线程private int start = 0;private Matrix matrix;public RadaView(Context context, AttributeSet attrs) {super(context, attrs);initPaint();mThread = new ScanThread(this);setBackgroundColor(Color.TRANSPARENT);}public RadaView(Context context) {this(context, null);}/** * 画笔的基本设置 */private void initPaint() {mPaintLine = new Paint();mPaintLine.setStrokeWidth(10);mPaintLine.setAntiAlias(true);mPaintLine.setStyle(Style.STROKE); mPaintLine.setColor(0xff000000);mPaintSector = new Paint();mPaintSector.setColor(0x9D00ff00);mPaintSector.setAntiAlias(true);}public void setViewSize(int size) {this.viewSize = size;setMeasuredDimension(viewSize, viewSize);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(viewSize, viewSize);}/** * 开始扫描 */public void startScann() {mThread.start();isstart = true;}/** * 暂停扫描 */public void stopScann() {if (isstart) {Thread.interrupted();isstart = false;}}public void setList(ArrayList<View> list) {for (int i = 0; i < list.size(); i++) {int xy[] = getRamdomXY();list.get(i).setX(xy[0]);list.get(i).setY(xy[1]);addView(list.get(i));}}private int[] getRamdomXY() {Random rand = new Random();int x = rand.nextInt(900);int y = rand.nextInt(900);int r = (int) ((float) viewSize / 2);if ((x >= r - 350 || x <= r + 350) && (y >= r - 350 || y <= r + 350)) {int xy[] = new int[2];xy[0] = x;xy[1] = y;return xy;} else {return getRamdomXY();}}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawCircle(viewSize / 2, viewSize / 2, 175, mPaintLine);canvas.drawCircle(viewSize / 2, viewSize / 2, 350, mPaintLine);canvas.drawLine(viewSize / 2, 0, viewSize / 2, viewSize, mPaintLine);canvas.drawLine(0, viewSize / 2, viewSize, viewSize / 2, mPaintLine); ///** * SweepGradient扫描/梯度渲染 * SweepGradient(float cx, float cy, int color0, int color1) * cx渲染中心点x 坐标         * cy渲染中心点y 坐标         * color0起始渲染颜色         * color1结束渲染颜色 *  */Shader mShader = new SweepGradient(viewSize / 2, viewSize / 2, Color.TRANSPARENT, Color.GREEN);mPaintSector.setShader(mShader);canvas.concat(matrix);canvas.drawCircle(viewSize / 2, viewSize / 2, 350, mPaintSector);super.onDraw(canvas);}protected class ScanThread extends Thread {private RadaView view;public ScanThread(RadaView view) {this.view = view;}@Overridepublic void run() {while (true) {if (isstart) {view.post(new Runnable() {public void run() {start = start + 1;matrix = new Matrix();matrix.postRotate(start, viewSize / 2, viewSize / 2);view.invalidate();}});try {Thread.sleep(10);  // 设置扫描的停止时间 } catch (InterruptedException e) {e.printStackTrace();}}}}}}


大功告成。谢谢阅读.


------Android开发基友群:64026923,众多妹纸、基友等着你哟。加的是群,涨的是技术:




1 0
原创粉丝点击