栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

自定义加锁wifi(宽高相等的方形区域为例,可以自行调整)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自定义加锁wifi(宽高相等的方形区域为例,可以自行调整)

自定义加锁wifi(宽高相等的方形区域为例,可以自行调整)

样式图:

实现思路:
1、绘制扇形半透明底图
2、绘制上层wifi信号等级白色扇形
3、弧形边缘擦除
4、带锁图标icon添加

绘制扇形半透明底图

获取设置的宽度:
private int wifiWidth;
onDraw()中:

wifiWidth = getWidth();

初始化画笔:
private Paint pDefault;

 pDefault.setAntiAlias(true);
 pDefault.setColor(ContextCompat.getColor(mContext, R.color.white));
 pDefault.setAlpha(60);
 pDefault.setStyle(Paint.Style.FILL);
 pDefault.setStrokeWidth(6);

平移绘制位置:
private static final int maxLevel = 4;//最大等级

 float signalRadius = wifiWidth * 1.0f / 2 / maxLevel;
 canvas.translate(0, wifiWidth / 5f + signalRadius);//绘制位置平移,根据需要自行调整

默认半透明底层扇形绘制:
private float startAngle = -135;//开始角度
private float sweepAngle = 90;//转过角度

  RectF defaultR = new RectF(0, 0, wifiWidth, wifiWidth);
  canvas.drawArc(defaultR, startAngle, sweepAngle, true, pDefault);
绘制上层wifi信号等级白色扇形

设置传递修改wifi等级的方法

 
    public void setWifiLevel(int level) {
        if (level < 0 || level > 4) throw new RuntimeException("wifi等级超出范围");
        this.level = level;
        invalidate();
    }

绘制wifi覆盖图

 if (level >= 0) {
    if (level >= 1) {
            level = level - 1;
        }
        float radius = signalRadius * level;
        RectF rectf = new RectF(radius, radius, wifiWidth - radius, wifiWidth - radius);
        topPaint.setStyle(Paint.Style.FILL);
        canvas.drawArc(rectf, startAngle, sweepAngle, true, topPaint);
    }
 canvas.restore();
弧形边缘擦除

DensityUtil.java代码:

import android.content.Context;
import android.util.DisplayMetrics;

import androidx.appcompat.app.AppCompatActivity;

public class DensityUtil {

    private volatile static DisplayMetrics displayMetrics;

    private synchronized  static DisplayMetrics initDisplayMetrics(){
        if(displayMetrics == null){
            displayMetrics = new DisplayMetrics();
        }
        return displayMetrics;
    }
    
    public static int dip2px(Context context, float dpValue) {
        initDisplayMetrics();
        ((AppCompatActivity)context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        float density= displayMetrics.density;
        return (int) (dpValue * density + 0.5f);
    }

    
    public static int px2dip(Context context, float pxValue) {
        initDisplayMetrics();
        ((AppCompatActivity)context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        float density= displayMetrics.density;
        return (int) (pxValue / density + 0.5f);
    }
}

关闭硬件加速

 setLayerType(View.LAYER_TYPE_SOFTWARE, null);//关闭硬件加速,解决变黑问题
 int ll = (int) (getWidth() * 0.6f);
 int lt = (int) ((int) (getWidth() * 0.25f + DensityUtil.dip2px(mContext, 4)) + wifiWidth / 5f);
 int lr = (int) (getWidth() * 0.90f);
 int lb = (int) (getHeight() * 0.85f);
 
 Paint mp = new Paint();
 mp.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
 mp.setStyle(Paint.Style.FILL);
 RectF rt = new RectF(ll + DensityUtil.dip2px(mContext, 1), lt, lr + DensityUtil.dip2px(mContext, 4), lb);
 canvas.drawArc(rt, 150, 150, false, mp);
带锁图标icon添加

  Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.icon_lock);
  canvas.drawBitmap(bitmap2, null, rl, null);

完整代码:

package com.xx.demo;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;

public class WifiView extends View {


    Context mContext;
    int level = -1;

    public WifiView(Context context) {
        super(context);
    }

    public WifiView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;

        setLayerType(View.LAYER_TYPE_SOFTWARE, null);//禁用硬件加速,解决变黑问题

        topPaint = new Paint();
        topPaint.setAntiAlias(true);
        topPaint.setColor(ContextCompat.getColor(mContext, R.color.white));
        topPaint.setStyle(Paint.Style.FILL);
        topPaint.setStrokeWidth(6);
        pDefault = new Paint();
    }

    
    public void setWifiLevel(int level) {
        if (level < 0 || level > 4) throw new RuntimeException("wifi等级超出范围");
        this.level = level;
        invalidate();
    }

    private int wifiWidth;
    private float startAngle = -135;
    private float sweepAngle = 90;
    private static final int maxLevel = 4;

    Paint topPaint;
    Paint pDefault;

    @SuppressLint("DrawAllocation")
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        wifiWidth = getWidth();

        int ll = (int) (getWidth() * 0.6f);
        int lt = (int) ((int) (getWidth() * 0.25f + DensityUtil.dip2px(mContext, 4)) + wifiWidth / 5f);
        int lr = (int) (getWidth() * 0.90f);
        int lb = (int) (getHeight() * 0.85f);

        Rect rl = new Rect(ll, lt, lr, lb);

        pDefault.setAntiAlias(true);
        pDefault.setColor(ContextCompat.getColor(mContext, R.color.white));
        pDefault.setAlpha(60);
        pDefault.setStyle(Paint.Style.FILL);
        pDefault.setStrokeWidth(6);


        float signalRadius = wifiWidth * 1.0f / 2 / maxLevel;
        canvas.translate(0, wifiWidth / 5f + signalRadius);//绘制位置平移,根据需要自行调整

        RectF defaultR = new RectF(0, 0, wifiWidth, wifiWidth);
        canvas.drawArc(defaultR, startAngle, sweepAngle, true, pDefault);

        if (level >= 0) {
            level = 4 - level;
            float radius = signalRadius * level;
            RectF rectf = new RectF(radius, radius, wifiWidth - radius, wifiWidth - radius);
            topPaint.setStyle(Paint.Style.FILL);
            canvas.drawArc(rectf, startAngle, sweepAngle, true, topPaint);
        }
        canvas.restore();

        Paint mp = new Paint();
        mp.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
        mp.setStyle(Paint.Style.FILL);

        RectF rt = new RectF(ll + DensityUtil.dip2px(mContext, 1), lt, lr + DensityUtil.dip2px(mContext, 4), lb);
        canvas.drawArc(rt, 150, 150, false, mp);

        Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.icon_lock);
        canvas.drawBitmap(bitmap2, null, rl, null);
    }
}

使用xml中:

 

java中:

WifiView wifiView;
wifiView = findViewById(R.id.wifi);
wifiView.setWifiLevel(2);

如果设置宽高,发现图标或者弧形偏移等情况,请自行调整,本文只提供一种思路。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1039470.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号