├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── gradle.xml ├── markdown-navigator │ └── profiles_settings.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── RadarScanViewLibrary ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── kongqw │ │ └── radarscanviewlibrary │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── kongqw │ │ │ └── radarscanviewlibrary │ │ │ └── RadarScanView.java │ └── res │ │ └── values │ │ ├── attrs.xml │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── kongqw │ └── radarscanviewlibrary │ └── ExampleUnitTest.java ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── kongqw │ │ └── androidradarscanview │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── kongqw │ │ │ └── androidradarscanview │ │ │ ├── ExampleApplication.java │ │ │ └── MainActivity.java │ └── res │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── kongqw │ └── androidradarscanview │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/markdown-navigator/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | C/C++ 39 | 40 | 41 | General 42 | 43 | 44 | Unused codeC/C++ 45 | 46 | 47 | 48 | 49 | Android 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 71 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Android 雷达扫描控件 2 | 3 | [![](https://jitpack.io/v/kongqw/AndroidRadarScanView.svg)](https://jitpack.io/#kongqw/AndroidRadarScanView) 4 | 5 | To get a Git project into your build: 6 | 7 | Step 1. Add the JitPack repository to your build file 8 | 9 | Add it in your root build.gradle at the end of repositories: 10 | 11 | ``` gradle 12 | allprojects { 13 | repositories { 14 | ... 15 | maven { url 'https://jitpack.io' } 16 | } 17 | } 18 | ``` 19 | 20 | Step 2. Add the dependency 21 | 22 | ``` gradle 23 | dependencies { 24 | compile 'com.github.kongqw:AndroidRadarScanView:1.0.1' 25 | } 26 | ``` 27 | 28 | ## 效果图 29 | 30 | ![AndroidRadarScanView](http://img.blog.csdn.net/20170310182212626?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcTQ4Nzg4MDI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 31 | 32 | ![AndroidRadarScanView](http://img.blog.csdn.net/20170310182359258?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcTQ4Nzg4MDI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 33 | 34 | ## XML 35 | 36 | ``` xml 37 | 41 | ``` 42 | 43 | ## 初始化 44 | 45 | ``` java 46 | radarScanView = (RadarScanView) findViewById(R.id.radarScanView); 47 | ``` 48 | 49 | ## 设置属性 50 | 51 | ### XML 52 | 53 | ``` xml 54 | xmlns:app="http://schemas.android.com/apk/res-auto" 55 | ``` 56 | 57 | ``` xml 58 | 70 | ``` 71 | 72 | 73 | | 属性 | 类型 | 描述 | 74 | | --- | ----| ---- | 75 | | radarScanTime | integer | 设置雷达扫描一圈时间 | 76 | | radarBackgroundLinesNumber | integer | 设置雷达背景圆圈数量 | 77 | | radarBackgroundLinesWidth | float | 设置雷达背景圆圈宽度 | 78 | | radarBackgroundLinesColor | color | 设置雷达背景圆圈颜色 | 79 | | radarBackgroundColor | color | 设置雷达背景颜色 | 80 | | radarScanColor | color | 设置雷达扫描颜色 | 81 | | radarScanAlpha | integer | 设置雷达扫描透明度 | 82 | 83 | 84 | ### Java 85 | 86 | ``` java 87 | radarScanView 88 | // 设置雷达扫描一圈时间 89 | .setRadarScanTime(2000) 90 | // 设置雷达背景颜色 91 | .setRadarBackgroundColor(Color.WHITE) 92 | // 设置雷达背景圆圈数量 93 | .setRadarBackgroundLinesNumber(4) 94 | // 设置雷达背景圆圈宽度 95 | .setRadarBackgroundLinesWidth(2) 96 | // 设置雷达背景圆圈颜色 97 | .setRadarBackgroundLinesColor(Color.GRAY) 98 | // 设置雷达扫描颜色 99 | .setRadarScanColor(0xFFAAAAAA) 100 | // 设置雷达扫描透明度 101 | .setRadarScanAlpha(0xAA); 102 | ``` 103 | 104 | ## 备用 105 | 106 | ### 手动开始扫描 107 | 108 | ``` java 109 | radarScanView.startScan(); 110 | ``` 111 | 112 | ### 手动停止扫描 113 | 114 | ``` java 115 | radarScanView.stopScan(); 116 | ``` 117 | 118 | -------------------------------------------------------------------------------- /RadarScanViewLibrary/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /RadarScanViewLibrary/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "25.0.2" 6 | 7 | defaultConfig { 8 | minSdkVersion 9 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0" 12 | 13 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 14 | 15 | } 16 | buildTypes { 17 | release { 18 | minifyEnabled false 19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 20 | } 21 | } 22 | } 23 | 24 | dependencies { 25 | compile fileTree(dir: 'libs', include: ['*.jar']) 26 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 27 | exclude group: 'com.android.support', module: 'support-annotations' 28 | }) 29 | compile 'com.android.support:appcompat-v7:25.2.0' 30 | testCompile 'junit:junit:4.12' 31 | } 32 | -------------------------------------------------------------------------------- /RadarScanViewLibrary/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/kongqingwei/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /RadarScanViewLibrary/src/androidTest/java/com/kongqw/radarscanviewlibrary/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.kongqw.radarscanviewlibrary; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.kongqw.radarscanviewlibrary.test", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /RadarScanViewLibrary/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /RadarScanViewLibrary/src/main/java/com/kongqw/radarscanviewlibrary/RadarScanView.java: -------------------------------------------------------------------------------- 1 | package com.kongqw.radarscanviewlibrary; 2 | 3 | import android.content.Context; 4 | import android.content.res.TypedArray; 5 | import android.graphics.Canvas; 6 | import android.graphics.Color; 7 | import android.graphics.Matrix; 8 | import android.graphics.Paint; 9 | import android.graphics.Point; 10 | import android.graphics.SweepGradient; 11 | import android.os.Handler; 12 | import android.support.annotation.NonNull; 13 | import android.support.annotation.Nullable; 14 | import android.util.AttributeSet; 15 | import android.util.Log; 16 | import android.view.View; 17 | 18 | /** 19 | * Created by kongqingwei on 2017/3/9. 20 | * 雷达扫描图 21 | */ 22 | public class RadarScanView extends View { 23 | 24 | private static final String TAG = "RadarScanView"; 25 | // 默认大小 26 | private static final int DEFAULT_SIZE = 200; 27 | // 刷新界面频率 黄金16毫秒 28 | private static final long REFRESH_RATE = 16; 29 | // 圆周360° 30 | private static final float ANGLE_360 = 360.0F; 31 | // 雷达扫描一圈的时间 默认1秒转一圈 32 | private int mRadarScanTime = 1000; 33 | // 雷达背景线的条数 默认3条 34 | private int mDefaultRadarBackgroundLinesNumber = 3; 35 | // 雷达背景线的宽度 默认2 36 | private static final float DEFAULT_RADAR_BACKGROUND_LINES_WIDTH = 2.0F; 37 | 38 | private static final int DEFAULT_RADAR_BACKGROUND_LINES_COLOR = Color.GRAY; 39 | 40 | private static final int DEFAULT_RADAR_BACKGROUND_COLOR = Color.argb(0x00, 0x00, 0x00, 0x00); 41 | 42 | private static final int DEFAULT_RADAR_SCAN_ALPHA = 0x99; 43 | // 雷达扫描的起始颜色 44 | private int mShaderStartColor = Color.parseColor("#00000000"); 45 | // 雷达扫描的结束颜色 46 | private int mShaderEndColor = Color.parseColor("#FF888888"); 47 | 48 | private Paint mRadarBackgroundLinesPaint; 49 | 50 | private Point mCenterPoint; 51 | private Matrix mMatrix; 52 | private Handler handler = new Handler(); 53 | private Runnable run = new Runnable() { 54 | @Override 55 | public void run() { 56 | mMatrix.postRotate(ANGLE_360 / mRadarScanTime * REFRESH_RATE, mCenterPoint.x, mCenterPoint.y); 57 | postInvalidate(); 58 | handler.postDelayed(run, REFRESH_RATE); 59 | } 60 | }; 61 | private Paint mRadarScanPaint; 62 | private Paint mRadarBackgroundPaint; 63 | private int mViewRadius; 64 | private float mScanRadius; 65 | 66 | public RadarScanView(Context context) { 67 | super(context); 68 | initView(); 69 | } 70 | 71 | public RadarScanView(Context context, @Nullable AttributeSet attrs) { 72 | super(context, attrs); 73 | initView(); 74 | initAttribute(context, attrs); 75 | } 76 | 77 | public RadarScanView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 78 | super(context, attrs, defStyleAttr); 79 | initView(); 80 | initAttribute(context, attrs); 81 | } 82 | 83 | /** 84 | * 初始化 85 | */ 86 | private void initView() { 87 | // 中心点 88 | mCenterPoint = new Point(); 89 | // 扫描旋转 90 | mMatrix = new Matrix(); 91 | // 背景的画笔 92 | mRadarBackgroundPaint = new Paint(); 93 | mRadarBackgroundPaint.setAntiAlias(true); 94 | mRadarBackgroundPaint.setColor(DEFAULT_RADAR_BACKGROUND_COLOR); 95 | // mRadarBackgroundPaint.setAlpha(0x00); 96 | // 背景线的画笔 97 | mRadarBackgroundLinesPaint = new Paint(); 98 | mRadarBackgroundLinesPaint.setAntiAlias(true); 99 | mRadarBackgroundLinesPaint.setStyle(Paint.Style.STROKE); 100 | mRadarBackgroundLinesPaint.setColor(DEFAULT_RADAR_BACKGROUND_LINES_COLOR); 101 | mRadarBackgroundLinesPaint.setStrokeWidth(DEFAULT_RADAR_BACKGROUND_LINES_WIDTH); 102 | // 雷达扫描的画笔 103 | mRadarScanPaint = new Paint(); 104 | mRadarScanPaint.setAntiAlias(true); 105 | mRadarScanPaint.setAlpha(DEFAULT_RADAR_SCAN_ALPHA); 106 | } 107 | 108 | /** 109 | * 获取属性 110 | * 111 | * @param context context 112 | * @param attrs attrs 113 | */ 114 | private void initAttribute(Context context, AttributeSet attrs) { 115 | TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RadarScanView); 116 | 117 | // 设置雷达扫描一圈时间 118 | setRadarScanTime(typedArray.getInteger( 119 | R.styleable.RadarScanView_radarScanTime, 120 | mRadarScanTime 121 | )); 122 | 123 | // 设置雷达背景圆圈数 124 | setRadarBackgroundLinesNumber(typedArray.getInteger( 125 | R.styleable.RadarScanView_radarBackgroundLinesNumber, 126 | mDefaultRadarBackgroundLinesNumber 127 | )); 128 | 129 | // 设置雷达圆圈宽度 130 | setRadarBackgroundLinesWidth(typedArray.getFloat( 131 | R.styleable.RadarScanView_radarBackgroundLinesWidth, 132 | DEFAULT_RADAR_BACKGROUND_LINES_WIDTH 133 | )); 134 | 135 | // 设置雷达圆圈颜色 136 | setRadarBackgroundLinesColor(typedArray.getColor( 137 | R.styleable.RadarScanView_radarBackgroundLinesColor, 138 | DEFAULT_RADAR_BACKGROUND_LINES_COLOR 139 | )); 140 | 141 | // 设置雷达背景颜色 142 | setRadarBackgroundColor(typedArray.getColor( 143 | R.styleable.RadarScanView_radarBackgroundColor, 144 | DEFAULT_RADAR_BACKGROUND_COLOR 145 | )); 146 | 147 | // 设置雷达扫描颜色 148 | setRadarScanColor(typedArray.getColor( 149 | R.styleable.RadarScanView_radarScanColor, 150 | mShaderEndColor 151 | )); 152 | 153 | // 设置雷达扫描透明度 154 | setRadarScanAlpha(typedArray.getInteger( 155 | R.styleable.RadarScanView_radarScanAlpha, 156 | DEFAULT_RADAR_SCAN_ALPHA 157 | )); 158 | 159 | typedArray.recycle(); 160 | } 161 | 162 | @Override 163 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 164 | setMeasuredDimension(getMeasuredSize(widthMeasureSpec), getMeasuredSize(heightMeasureSpec)); 165 | } 166 | 167 | @Override 168 | protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 169 | super.onLayout(changed, left, top, right, bottom); 170 | if (changed) { 171 | // 控件宽度 172 | int measuredWidth = getMeasuredWidth(); 173 | // 控件高度 174 | int measuredHeight = getMeasuredHeight(); 175 | // Log.i(TAG, "onLayout: -------------------"); 176 | // Log.i(TAG, "onLayout: measuredWidth = " + measuredWidth + " measuredHeight = " + measuredHeight); 177 | // Log.i(TAG, "onLayout: -------------------"); 178 | // 控件半径 179 | mViewRadius = Math.min(measuredWidth, measuredHeight) / 2; 180 | // 扫描半径 181 | mScanRadius = (mViewRadius - mRadarBackgroundLinesPaint.getStrokeWidth() / 2); 182 | // 中心点 183 | mCenterPoint.set(measuredWidth / 2, measuredHeight / 2); 184 | 185 | startScan(); 186 | } 187 | } 188 | 189 | @Override 190 | protected void onVisibilityChanged(@NonNull View changedView, int visibility) { 191 | super.onVisibilityChanged(changedView, visibility); 192 | if (VISIBLE == visibility) { 193 | startScan(); 194 | } else { 195 | stopScan(); 196 | } 197 | } 198 | 199 | @Override 200 | protected void onDetachedFromWindow() { 201 | stopScan(); 202 | super.onDetachedFromWindow(); 203 | } 204 | 205 | /** 206 | * 获取测量后的大小 207 | * 208 | * @param measureSpec measureSpec 209 | * @return measuredSize 210 | */ 211 | private int getMeasuredSize(int measureSpec) { 212 | switch (MeasureSpec.getMode(measureSpec)) { 213 | case MeasureSpec.EXACTLY: // 精确值模式(指定值/match_parent) 214 | return MeasureSpec.getSize(measureSpec); 215 | case MeasureSpec.AT_MOST: // 最大值模式(wrap_content) 216 | return Math.min(DEFAULT_SIZE, MeasureSpec.getSize(measureSpec)); 217 | case MeasureSpec.UNSPECIFIED: // 不指定大小的测量模式 218 | return DEFAULT_SIZE; 219 | default: 220 | return DEFAULT_SIZE; 221 | } 222 | } 223 | 224 | @Override 225 | protected void onDraw(Canvas canvas) { 226 | super.onDraw(canvas); 227 | 228 | // 画背景 229 | canvas.drawCircle(mCenterPoint.x, mCenterPoint.y, mViewRadius, mRadarBackgroundPaint); 230 | // 划线 231 | for (int i = 1; i <= mDefaultRadarBackgroundLinesNumber; i++) { 232 | int radius = (int) (mScanRadius / mDefaultRadarBackgroundLinesNumber * i); 233 | // 画线 234 | canvas.drawCircle(mCenterPoint.x, mCenterPoint.y, radius, mRadarBackgroundLinesPaint); 235 | } 236 | // 画扇形 237 | drawFan(canvas, mViewRadius); 238 | } 239 | 240 | /** 241 | * 画扇形 242 | * 243 | * @param canvas canvas 244 | * @param scanRadius scanRadius 245 | */ 246 | private void drawFan(Canvas canvas, int scanRadius) { 247 | mRadarScanPaint.setShader(new SweepGradient( 248 | mCenterPoint.x, // 中心X坐标 249 | mCenterPoint.y, // 中心Y坐标 250 | mShaderStartColor, // Shader始端颜色 251 | mShaderEndColor // Shader末端颜色 252 | )); 253 | canvas.concat(mMatrix); 254 | canvas.drawCircle(mCenterPoint.x, mCenterPoint.y, scanRadius, mRadarScanPaint); 255 | } 256 | 257 | /** 258 | * 设置雷达背景圆圈数 259 | * 260 | * @param number 数量 261 | * @return RadarScanView 262 | */ 263 | public RadarScanView setRadarBackgroundLinesNumber(int number) { 264 | if (0 < mDefaultRadarBackgroundLinesNumber) { 265 | this.mDefaultRadarBackgroundLinesNumber = number; 266 | } 267 | return this; 268 | } 269 | 270 | /** 271 | * 设置雷达背景圆圈宽度 272 | * 273 | * @param width 宽度 274 | * @return RadarScanView 275 | */ 276 | public RadarScanView setRadarBackgroundLinesWidth(float width) { 277 | mRadarBackgroundLinesPaint.setStrokeWidth(width); 278 | // 扫描半径 279 | mScanRadius = mViewRadius - width / 2; 280 | return this; 281 | } 282 | 283 | /** 284 | * 设置雷达背景圆圈颜色 285 | * 286 | * @param color 色值 287 | * @return RadarScanView 288 | */ 289 | public RadarScanView setRadarBackgroundLinesColor(int color) { 290 | mRadarBackgroundLinesPaint.setColor(color); 291 | return this; 292 | } 293 | 294 | /** 295 | * 设置雷达背景色 296 | * 297 | * @param color 色值 298 | * @return RadarScanView 299 | */ 300 | public RadarScanView setRadarBackgroundColor(int color) { 301 | mRadarBackgroundPaint.setColor(color); 302 | return this; 303 | } 304 | 305 | /** 306 | * 设置雷达扫描颜色 307 | * 308 | * @param endColor 末端色值 309 | * @return RadarScanView 310 | */ 311 | public RadarScanView setRadarScanColor(int endColor) { 312 | setRadarScanColors(0x00000000, endColor); 313 | return this; 314 | } 315 | 316 | /** 317 | * 设置雷达扫描颜色 318 | * 319 | * @param startColor 始端色值 320 | * @param endColor 末端色值 321 | * @return RadarScanView 322 | */ 323 | public RadarScanView setRadarScanColors(int startColor, int endColor) { 324 | mShaderStartColor = startColor; 325 | mShaderEndColor = endColor; 326 | return this; 327 | } 328 | 329 | // public RadarScanView setRadarScanColors(int colors[], float positions[]) { 330 | // shader = new SweepGradient( 331 | // mCenterPoint.x, // 中心X坐标 332 | // mCenterPoint.y, // 中心Y坐标 333 | // colors, // 颜色 334 | // positions // 位置 335 | // ); 336 | // mRadarScanPaint.setShader(shader); 337 | // return this; 338 | // } 339 | 340 | /** 341 | * 设置雷达扫描透明度 342 | * 343 | * @param alpha 透明度 344 | * @return RadarScanView 345 | */ 346 | public RadarScanView setRadarScanAlpha(int alpha) { 347 | mRadarScanPaint.setAlpha(alpha); 348 | return this; 349 | } 350 | 351 | 352 | /** 353 | * 设置雷达扫描一圈的时间 354 | * 355 | * @param milliseconds 时间毫秒值 356 | */ 357 | public RadarScanView setRadarScanTime(int milliseconds) { 358 | if (0 < milliseconds) { 359 | this.mRadarScanTime = milliseconds; 360 | } 361 | return this; 362 | } 363 | 364 | /** 365 | * 开始扫描 366 | */ 367 | public void startScan() { 368 | stopScan(); 369 | Log.i(TAG, "startScan: "); 370 | handler.post(run); 371 | } 372 | 373 | /** 374 | * 结束扫描 375 | */ 376 | public void stopScan() { 377 | Log.i(TAG, "stopScan: "); 378 | handler.removeCallbacks(run); 379 | } 380 | } 381 | -------------------------------------------------------------------------------- /RadarScanViewLibrary/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /RadarScanViewLibrary/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | RadarScanViewLibrary 3 | 4 | -------------------------------------------------------------------------------- /RadarScanViewLibrary/src/test/java/com/kongqw/radarscanviewlibrary/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.kongqw.radarscanviewlibrary; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "25.0.2" 6 | defaultConfig { 7 | applicationId "com.kongqw.androidradarscanview" 8 | minSdkVersion 9 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(include: ['*.jar'], dir: 'libs') 24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 25 | exclude group: 'com.android.support', module: 'support-annotations' 26 | }) 27 | compile 'com.android.support:appcompat-v7:25.2.0' 28 | compile 'com.android.support.constraint:constraint-layout:1.0.1' 29 | testCompile 'junit:junit:4.12' 30 | compile project(':RadarScanViewLibrary') 31 | 32 | debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' 33 | releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' 34 | testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' 35 | } 36 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/kongqingwei/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/kongqw/androidradarscanview/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.kongqw.androidradarscanview; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.kongqw.androidradarscanview", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/kongqw/androidradarscanview/ExampleApplication.java: -------------------------------------------------------------------------------- 1 | package com.kongqw.androidradarscanview; 2 | 3 | import android.app.Application; 4 | 5 | import com.squareup.leakcanary.LeakCanary; 6 | 7 | /** 8 | * Created by kongqingwei on 2017/3/9. 9 | */ 10 | 11 | public class ExampleApplication extends Application { 12 | 13 | @Override 14 | public void onCreate() { 15 | super.onCreate(); 16 | if (LeakCanary.isInAnalyzerProcess(this)) { 17 | // This process is dedicated to LeakCanary for heap analysis. 18 | // You should not init your app in this process. 19 | return; 20 | } 21 | LeakCanary.install(this); 22 | // Normal app init code... 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/kongqw/androidradarscanview/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.kongqw.androidradarscanview; 2 | 3 | import android.graphics.Color; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | 8 | import com.kongqw.radarscanviewlibrary.RadarScanView; 9 | 10 | public class MainActivity extends AppCompatActivity { 11 | 12 | private RadarScanView radarScanView; 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_main); 18 | 19 | radarScanView = (RadarScanView) findViewById(R.id.radarScanView); 20 | // radarScanView 21 | // // 设置雷达扫描一圈时间 22 | // .setRadarScanTime(2000) 23 | // // 设置雷达背景颜色 24 | // .setRadarBackgroundColor(Color.WHITE) 25 | // // 设置雷达背景圆圈数 26 | // .setRadarBackgroundLinesNumber(4) 27 | // // 设置底盘圆圈宽度 28 | // .setRadarBackgroundLinesWidth(2) 29 | // // 设置雷达圆圈颜色 30 | // .setRadarBackgroundLinesColor(Color.GRAY) 31 | // // 设置雷达扫描颜色 32 | // .setRadarScanColor(0xFFAAAAAA) 33 | // // 设置雷达扫描透明度 34 | // .setRadarScanAlpha(0xAA); 35 | } 36 | 37 | @Override 38 | protected void onResume() { 39 | super.onResume(); 40 | // radarScanView.startScan(); 41 | } 42 | 43 | public void startScan(View view) { 44 | radarScanView.startScan(); 45 | } 46 | 47 | public void stopScan(View view) { 48 | radarScanView.stopScan(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 |