绘制圆形的图片(增强版)

本文详细介绍了一个自定义Android视图的实现过程,包括如何利用Bitmap进行圆形图像处理,使用不同PorterDuff.Mode实现图像混合效果,以及如何通过postInvalidate()方法更新视图。此外还提供了一些关于MeasureSpec测量策略的解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重绘方法
postInvalidate();这个方法是直接重绘的
//100毫秒重绘一次
        postInvalidateDelayed(100);
使用方法:
<com.example.k.shoppingapp.Other.MyView
            android:id="@+id/baby_user"
            android:layout_width="30dp"
            android:layout_height="30dp"
            />
代码:
myView.bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.user);
        myView.postInvalidate();

主类:
package com.example.k.test;

/**
 * Created by k on 2016/7/26.
 */

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.util.AttributeSet;
import android.view.View;

/**
 * Created by k on 2016/6/7.
 */
public class MyView extends View {
	Context context;
    int mHeight = 0,mWidth = 0;
    public Bitmap bitmap = null;
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
	this.context = context;
        bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.bb);
    }
    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int f = measuredWidth(widthMeasureSpec);
        int g = measuredHeight(heightMeasureSpec);
        setMeasuredDimension(f, g);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int min = Math.min(mWidth, mHeight);
        /**
         * 长度如果不一致,按小的值进行压缩
         */
        bitmap = Bitmap.createScaledBitmap(bitmap, min, min, false);
        canvas.drawBitmap(createCircleImage(bitmap, min), 0, 0, null);
    }
    //************************************************************************************************
    private int measuredWidth(int widthMeasureSpec) {
        int Mode = MeasureSpec.getMode(widthMeasureSpec);
        int Size = MeasureSpec.getSize(widthMeasureSpec);
        if (Mode == MeasureSpec.EXACTLY) {
            mWidth = Size;
        } else {
            //由图片决定大小
            int value = getPaddingLeft()+getPaddingRight()+bitmap.getWidth();
            if (Mode == MeasureSpec.AT_MOST) {
                //由图片和Padding决定宽度,但是不能超过View的宽
                mWidth = Math.min(value,Size);
            }
        }
        return mWidth;
    }
    //**********************************************************************************************
    private int measuredHeight(int heightMeasureSpec) {
        int Mode = MeasureSpec.getMode(heightMeasureSpec);
        int Size = MeasureSpec.getSize(heightMeasureSpec);
        if (Mode == MeasureSpec.EXACTLY) {
            mHeight = Size;
        } else {
            //由图片决定高度
            int intvalur1 = getPaddingTop()+getPaddingBottom()+bitmap.getHeight();
            if (Mode == MeasureSpec.AT_MOST) {
                //由图片和Padding决定大小,但是不能超过View的高
                mHeight = Math.min(intvalur1,Size);
            }
        }
        return mHeight;
    }
    //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    private Bitmap createCircleImage(Bitmap source, int min)
    {
        final Paint paint = new Paint();
        final Paint paint1 = new Paint();
        final Paint paint2 = new Paint();
        //消除锯齿,让绘制出来的画更清晰
        paint.setAntiAlias(true);
        paint1.setAntiAlias(true);
        paint2.setAntiAlias(true);
        paint2.setColor(Color.parseColor("#553638"));
        //创建一个Bitmap
        Bitmap target = Bitmap.createBitmap(min, min, Bitmap.Config.ARGB_8888);
        Bitmap target1 = Bitmap.createBitmap(min,min,Bitmap.Config.ARGB_8888);

        /**
         * 产生一个同样大小的画布
         */
        //以后再Canvas上的画图操作都会作用在target上
        Canvas canvas = new Canvas(target);
        Canvas canvas1 = new Canvas(target1);

        /**
         * 首先绘制圆形
         */
        //第一个参数为圆心的x坐标,第二个参数为圆心的y坐标,第三个为圆心的半径
        canvas.drawCircle(min / 2, min / 2, min / 2-Adaptation.dp2px(context,1)/2, paint);
        canvas1.drawCircle(min / 2, min / 2, min / 2, paint2);
        /**
         * 使用SRC_IN模式显示后画图的交集处
         */
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        //这种模式是前图和后图一起显示,如果有相交的部分只显示后图的
        paint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER));
        /**
         * 绘制图片
         */
        canvas.drawBitmap(source, 0, 0, paint);
        canvas1.drawBitmap(target,0,0,paint1);
        return target1;
    }
   
}



配合适配类使用:
package com.example.k.shoppingapp.Util;

import android.content.Context;

/**
 * Created by k on 2016/8/14.
 */
public class Adaptation {
    public static int dp2px(Context context,float dp) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dp * scale + 0.5f);
    }
    //sp转px
    public static int sp2px(Context context,float sp) {
        final float scale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (sp * scale + 0.5f);
    }
}







下面是一些配置内容

1.PorterDuff.Mode.CLEAR  

  所绘制不会提交到画布上。

2.PorterDuff.Mode.SRC

   显示上层绘制图片

3.PorterDuff.Mode.DST

  显示下层绘制图片

4.PorterDuff.Mode.SRC_OVER

  正常绘制显示,上下层绘制叠盖。

5.PorterDuff.Mode.DST_OVER

  上下层都显示。下层居上显示。

6.PorterDuff.Mode.SRC_IN

   取两层绘制交集。显示上层。

7.PorterDuff.Mode.DST_IN

  取两层绘制交集。显示下层。

8.PorterDuff.Mode.SRC_OUT

 取上层绘制非交集部分。

9.PorterDuff.Mode.DST_OUT

 取下层绘制非交集部分。

10.PorterDuff.Mode.SRC_ATOP

 取下层非交集部分与上层交集部分

11.PorterDuff.Mode.DST_ATOP

 取上层非交集部分与下层交集部分

12.PorterDuff.Mode.XOR

  异或:去除两图层交集部分

13.PorterDuff.Mode.DARKEN

  取两图层全部区域,交集部分颜色加深

14.PorterDuff.Mode.LIGHTEN

  取两图层全部,点亮交集部分颜色

15.PorterDuff.Mode.MULTIPLY

  取两图层交集部分叠加后颜色

16.PorterDuff.Mode.SCREEN

  取两图层全部区域,交集部分变为透明色

标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值