android中handler内存泄漏解决方法,安卓实现自定义View画时钟,并解决handler内存泄漏问题。...

安卓实现自定义View画时钟,并解决handler内存泄漏问题。

安卓实现自定义View画时钟,并解决handler内存泄漏问题。

直接上效果图:

08c269e5f95555a0b1bfb60ecd7359d0.png

具体代码如下:(注释已经写得很清楚了哈)

package com.lenz.arouter.clearpwtest;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.os.Handler;

import android.os.Message;

import android.util.AttributeSet;

import android.view.View;

import java.lang.ref.WeakReference;

import java.util.Calendar;

public class StudyView extends View {

private float mWidth, mHeight;

private int mHours, mMinutes, mSeconds;

private TimerHandler mHandler;

//采用弱引用防止内存泄漏

private static final class TimerHandler extends Handler {

private WeakReference clockViewWeakReference;

private TimerHandler(StudyView clockView) {

clockViewWeakReference = new WeakReference<>(clockView);

}

@Override

public void handleMessage(Message msg) {

StudyView view = clockViewWeakReference.get();

if (view != null) {

view.getTime();

view.invalidate();//重新绘制

sendEmptyMessageDelayed(1, 1000);//每1000毫秒一请求

}

}

}

public StudyView(Context context) {

this(context, null);

}

public StudyView(Context context, AttributeSet attrs) {

this(context, null, 0);

}

public StudyView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

mHandler = new TimerHandler(this);

getTime();

mHandler.sendEmptyMessageDelayed(1, 1000);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

//获取屏幕宽高

mWidth = getWidth();

mHeight = getHeight();

Paint paint = new Paint();//定义画笔

paint.setAntiAlias(true);//开启抗锯齿

paint.setStrokeWidth(5);//笔的宽

paint.setColor(Color.BLACK);//颜色

paint.setTextSize(mWidth / 22);

//画表盘

paint.setStyle(Paint.Style.STROKE);//中空圆心

canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth / 2, paint);

//画圆心

paint.setColor(Color.BLUE);//重新定义画圆心笔的颜色

paint.setStyle(Paint.Style.FILL_AND_STROKE);//实心圆

canvas.drawCircle(mWidth / 2, mHeight / 2, 8, paint);

paint.setColor(Color.BLACK);

//画小时刻度,以下那些比例是自己调的不是固定的。

for (int i = 0; i < 12; i++) {

canvas.save();

canvas.rotate(360 / 12 * (1 + i), mWidth / 2, mHeight / 2);

canvas.drawLine(mWidth / 2, mHeight / 2 - mWidth / 2, mWidth / 2, mHeight / 2 - mWidth / 2 + mWidth / 15, paint);

canvas.drawText((i + 1) + "", mWidth / 2 - mWidth / 50, mHeight / 2 - mWidth / 2 + mWidth / 8, paint);

canvas.restore();

}

//画分钟刻度

for (int i = 0; i < 60; i++) {

canvas.save();

canvas.rotate(360 / 60 * (1 + i), mWidth / 2, mHeight / 2);

canvas.drawLine(mWidth / 2, mHeight / 2 - mWidth / 2, mWidth / 2, mHeight / 2 - mWidth / 2 + mWidth / 20, paint);

canvas.restore();

}

//画时针

paint.setStrokeCap(Paint.Cap.ROUND);

paint.setStrokeWidth(14);

canvas.save();

//这里为什么要乘以0.5;

// 比如九点半,时针应该指在9-10之间的2.5格。

// 又因为9-10之间占圆盘的30度,则9-10之间一小格为6度,2.5格即为15度

//15度为30度的0.5,所以这里要记得分钟数要乘以0.5

canvas.rotate(360 / 12 * mHours + mMinutes * 0.5f, mWidth / 2, mHeight / 2);

canvas.drawLine(mWidth / 2, mHeight / 2 - mHeight / 150, mWidth / 2, mHeight / 2 - mHeight / 7, paint);

canvas.restore();

//绘制分针

paint.setStrokeCap(Paint.Cap.ROUND);

paint.setColor(Color.RED);

paint.setStrokeWidth(9);

canvas.save();

canvas.rotate(360 / 60 * mMinutes + mSeconds * 0.1f, mWidth / 2, mHeight / 2);

canvas.drawLine(mWidth / 2, mHeight / 2 - mHeight / 150, mWidth / 2, mHeight / 2 - mHeight / 6, paint);

canvas.restore();

//绘制秒针

paint.setStrokeCap(Paint.Cap.ROUND);

paint.setColor(Color.BLACK);

paint.setStrokeWidth(5);

canvas.save();

canvas.rotate(360 / 60 * mSeconds, mWidth / 2, mHeight / 2);

canvas.drawLine(mWidth / 2, mHeight / 2 - mHeight / 150, mWidth / 2, mHeight / 2 - mHeight / 4, paint);

canvas.restore();

}

//获取时间

public void getTime() {

Calendar calendar = Calendar.getInstance();

mHours = calendar.get(Calendar.HOUR);

mMinutes = calendar.get(Calendar.MINUTE);

mSeconds = calendar.get(Calendar.SECOND);

}

}

安卓实现自定义View画时钟,并解决handler内存泄漏问题。相关教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值