自定义控件(26)---图片伸缩、圆角切割、内存位图

2024-08-31 23:18

本文主要是介绍自定义控件(26)---图片伸缩、圆角切割、内存位图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果图如下:::

需要的素材

可以了解:如何图片伸缩,以及图片的圆角切割(内存生成位图)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.customeprogressbar.MainActivity" ><com.example.customeprogressbar.CustomProgressBarandroid:id="@+id/progress"android:layout_width="180dip"android:layout_height="10dip"android:layout_centerInParent="true"android:background="@drawable/pro_line" /></RelativeLayout>

CustomProgressBar

package com.example.customeprogressbar;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
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.view.View;public class CustomProgressBar extends View {int width;int height;Bitmap sourBg;Bitmap barBg;/*** 构造方法*/public CustomProgressBar(Context ctx) {super(ctx);}public CustomProgressBar(Context context, AttributeSet attrs,int defStyleAttr) {super(context, attrs, defStyleAttr);}public CustomProgressBar(Context context, AttributeSet attrs) {super(context, attrs);}/*** * android:layout_width="180dip" android:layout_height="10dip"*/@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {this.width = getWidth();this.height = getHeight();// 获取进度条矩形图片this.sourBg = BitmapFactory.decodeResource(getResources(),R.drawable.pro_state);// 裁剪跟背景图同样大小的矩形图片(非圆角)this.sourBg = conBitmapSize(this.sourBg, this.width, this.height);// 裁剪圆角图片this.barBg = toRoundCorner(this.sourBg, dip2px(getContext(), 4.33f));// 4.33f表示进度条的圆角大小super.onSizeChanged(w, h, oldw, oldh);}protected void onDraw(Canvas canvas) {if (this.barBg != null) {canvas.drawBitmap(this.barBg, 0.0F, 0.0F, null);}super.onDraw(canvas);}/*** 通过缩放比例那个背景图片,然后生成跟底部图片大小一样的(除去圆角) Bitmap.createBitmap* * @param bitmap*            进度的背景图片* @param width*            控件宽* @param height*            控件高*/private Bitmap conBitmapSize(Bitmap bitmap, int width, int height) {Matrix matrix = new Matrix();// 缩放比例matrix.setScale(1.0F * width / bitmap.getWidth(), 1.0F * height/ bitmap.getHeight());bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), matrix, false);return bitmap;}/**切割圆角:::::* 创建一个以位图为底的画布 在canvas初始化的时候就传入了一个空的bitmap* 最后canvas中绘画的内容都被绘制到了bitmap中,从而得到了我们需要的bitmap*/private Bitmap toRoundCorner(Bitmap bitmap, int pixels) {// 生成一个位图图像Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(output);Paint paint = new Paint();paint.setAntiAlias(true);Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());RectF rectF = new RectF(rect);float roundPx = pixels;/*** rect:RectF对象。* * rx:x方向上的圆角半径。* * ry:y方向上的圆角半径。* * paint:绘制时所使用的画笔。*/canvas.drawRoundRect(rectF, roundPx, roundPx, paint);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));canvas.drawBitmap(bitmap, rect, rect, paint);
//		canvas.drawBitmap(bitmap, src, dst, paint)return output;}public static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}
}


这篇关于自定义控件(26)---图片伸缩、圆角切割、内存位图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125273

相关文章

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解

《SpringBootAspectJ切面配合自定义注解实现权限校验的示例详解》本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验,本文结合实例代码给大家介绍的非... 目录1. 创建权限校验注解2. 创建ASPectJ切面拦截注解校验权限3. 用法示例A. 参考文章本文

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的