玩玩微信雷达扫描布局
来源:互联网 发布:java暂停线程wait 编辑:程序博客网 时间:2024/05/17 09:29
先来看下效果图吧:
代码如下:
public class MyRadar extends View {
Paint mEmptyFCirclePaint;//圆圆
Paint mGradientCirclepaint;//渐变的圆圆
int w, h;//屏幕宽和高
float degree = 0;//角度
Matrix matrix;
Handler mHandler = new Handler();
private Runnable run = new Runnable() {
@Override
public void run() {
matrix.setRotate(++degree, w / 2, h / 2);
MyRadar.this.invalidate();
mHandler.postDelayed(run, 30);
}
};
public MyRadar(Context context, AttributeSet attrs) { super(context, attrs); setBackgroundResource(R.drawable.star); initPaint(); //获取当前屏幕的宽和高 w = context.getResources().getDisplayMetrics().widthPixels; h = context.getResources().getDisplayMetrics().heightPixels; matrix = new Matrix(); mHandler.post(run); // Log.i("1111111",String.valueOf(w)); 720 // Log.i("1111111",String.valueOf(h)); 1280}private void initPaint() { mEmptyFCirclePaint = new Paint(); mEmptyFCirclePaint.setAntiAlias(true); mEmptyFCirclePaint.setColor(Color.parseColor("#A1A1A1")); mEmptyFCirclePaint.setStyle(Paint.Style.STROKE); mEmptyFCirclePaint.setStrokeWidth(3);}@Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas); //画四个圆,一共有四个参数,前二个分别为圆心的横纵坐标,第三个是半径,第四个是画笔 canvas.drawCircle(w / 2, h / 2, w / 6, mEmptyFCirclePaint); canvas.drawCircle(w / 2, h / 2, w / 3, mEmptyFCirclePaint); canvas.drawCircle(w / 2, h / 2, w / 20 * 11, mEmptyFCirclePaint); canvas.drawCircle(w / 2, h / 2, 7 * h / 16, mEmptyFCirclePaint); //渐变效果的圆圆 SweepGradient gradient = new SweepGradient(w / 2, h / 2, Color.TRANSPARENT, Color.parseColor("#AAAAAAAA")); mGradientCirclepaint = new Paint(); mGradientCirclepaint.setAntiAlias(true); mGradientCirclepaint.setColor(Color.parseColor("#A1A1A1")); mGradientCirclepaint.setStyle(Paint.Style.FILL); mGradientCirclepaint.setShader(gradient); //concat()必须先调用于drawCircle(),否则效果不会出来 canvas.concat(matrix); canvas.drawCircle(w / 2, h / 2, 7 * h / 16, mGradientCirclepaint); //reset()可以重新设置matrix的值,否则速度回越转越快 matrix.reset(); //当按下屏幕时实现波浪效果 if (waves != null && waves.keySet().size() > 0) { for (String n : waves.keySet()) { if (waves.get(n) != null) { canvas.drawCircle(waves.get(n).cx, waves.get(n).cy, waves.get(n).currentRadius, waves.get(n).mPaint); } } }}//触摸@Overridepublic boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { //波浪效果 launchingWave(); } return super.onTouchEvent(event);}private Map<String, Wave> waves;private void launchingWave() { if (waves == null) { waves = new HashMap<>(); final Wave temp = new Wave(w / 2, h / 2, 0, 0, 7 * h / 16, Color.parseColor("#22ffffff")); final String tag = String.valueOf(System.currentTimeMillis()); waves.put(tag, temp); Runnable mRun = new Runnable() { @Override public void run() { if (temp.currentRadius < temp.maxRadius) { temp.currentRadius += 10; int diff = temp.maxRadius - temp.startRadius; temp.mPaint.setAlpha((temp.maxRadius - temp.currentRadius) * 60 / diff); mHandler.postDelayed(this, 3); } else { waves.put(tag, null); } } }; mRun.run(); }}
}
Wave的代码如下:
public class Wave { public Wave(int cx, int cy, int currentRadius, int startRadius, int maxRadius,int currentColor) { this.cx = cx; this.cy = cy; this.currentRadius = currentRadius; this.startRadius = startRadius; this.maxRadius = maxRadius; this.currentColor = currentColor; mPaint= new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(currentColor); mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(3); } public int cx,cy; public int currentRadius; public int startRadius,maxRadius; public Paint mPaint ; public int currentColor;}
经过测试,点一下屏幕波浪会出现,点第二次就没有了,看了几遍代码实在没找出Bug在哪。还望读者给予指导。对了。CSDN博客怎么上传Gif效果图呢。谢谢!
1 0
- 玩玩微信雷达扫描布局
- 微信QQ附近好友雷达扫描
- 微信QQ附近好友雷达扫描
- Android模仿微信、云播雷达扫描动画效果
- 雷达扫描
- 雷达扫描
- Android自定义View之微信雷达
- Android自定义View之微信雷达
- VB的雷达扫描
- Android雷达扫描
- canvas雷达扫描特效
- code扫描雷达
- Android 雷达扫描效果
- android 仿微信雷达扫描
- 雷达扫描动画
- 仿微信雷达扫描
- iOS雷达扫描demo
- 微信扫描登录
- 【leetcode】136. Single Number
- 设计模式之多例模式
- Kafka读写
- Description Resource Path Location Type Cannot change version of project facet Dynamic Web Module to
- java/javaweb打war包
- 玩玩微信雷达扫描布局
- u盘在linux系统上只读的处理方法
- x.SAXParseException; lineNumber: 1; columnNumber: 1; 文件提前结束。
- Mysql支持emoji 表情符号 升级编码为UTF8MB4
- 两位数乘以一位数
- vb
- Mysql常用语句
- c++ 带默认值的构造函数 定义与实现分离
- linux之sed用法