自定义装饰ImageView类:DecorateImageView

public class DecorateImageView extends ImageView {private Paint mPaint=new Paint();private int mWidth,mHeight;private int mTextSize=30;private String mText;//文字private Bitmap mLogo;//水印private Bitmap mFrame;//边框public DecorateImageView(Context context) {super(context);}public DecorateImageView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);mPaint.setColor(Color.parseColor("#8800FF"));mPaint.setTextSize(Utils.dp2px(context,mTextSize));}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mWidth=getMeasuredWidth();
//        mHeight=getMinimumHeight();mHeight=300*2;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if(mFrame !=null){canvas.drawBitmap(mFrame,null,new Rect(0,0,mWidth,mHeight),mPaint);}if(!TextUtils.isEmpty(mText)){int textHeight= (int)MeasureUtil.getTextHeight(mText,mTextSize);canvas.drawText(mText,0,Math.abs(mHeight-textHeight),mPaint);}if(null!=mLogo){canvas.drawBitmap(mLogo,mWidth-mLogo.getWidth(),mHeight-mLogo.getHeight(),mPaint);}}public void showNone(){mText="";mLogo=null;mFrame=null;postInvalidate();}public void showText(String text,boolean isReset){if(isReset){showNone();}mText=text;postInvalidate();}public void showLogo(Bitmap bitmap,boolean isReset){if(isReset){showNone();}mLogo=bitmap;postInvalidate();}public void showFrame(Bitmap bitmap,boolean isReset){if(isReset){showNone();}mFrame=bitmap;postInvalidate();}
}

布局如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".activity.DecorateImageViewActivity"><TextViewapp:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"android:id="@+id/tv_label"android:text="图像装饰类型:"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Spinnerapp:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toEndOf="@id/tv_label"app:layout_constraintEnd_toEndOf="parent"android:id="@+id/spinner"android:layout_width="0dp"android:layout_height="wrap_content"android:spinnerMode="dialog"/><top.lc951.myandroid.views.DecorateImageViewandroid:id="@+id/iv_decorate"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/tv_label"android:layout_width="match_parent"android:layout_height="300dp"android:src="@mipmap/ic_img01"android:scaleType="fitXY"android:layout_margin="10dp"/></android.support.constraint.ConstraintLayout>

Activity控制类

package top.lc951.myandroid.activity;import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;import top.lc951.myandroid.R;
import top.lc951.myandroid.views.DecorateImageView;/*** 图片装饰 文字、水印、边框* 参考:{@link DecorateImageView}*/
public class DecorateImageViewActivity extends AppCompatActivity {private DecorateImageView decorateImageView;public static void actionActivity(Context context) {Intent intent = new Intent(context, DecorateImageViewActivity.class);context.startActivity(intent);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_decorate_image_view);decorateImageView=findViewById(R.id.iv_decorate);initDecorateSpinner();}private String[] decorateNameArray = {"无装饰", "文字", "图片水印", "相框"};private void initDecorateSpinner() {ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,decorateNameArray);Spinner spinner=findViewById(R.id.spinner);spinner.setPrompt("请选择装饰类型");spinner.setAdapter(arrayAdapter);spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {showResult(position);}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});spinner.setSelection(0);}private void showResult(int position) {switch (position){case 0:decorateImageView.showNone();break;case 1:decorateImageView.showText("@lichong951",true);break;case 2:Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.lichong951);decorateImageView.showLogo(bitmap,true);break;case 3:Bitmap frame = BitmapFactory.decodeResource(getResources(), R.mipmap.photo_frame3);decorateImageView.showFrame(frame,true);break;default:break;}}}

工具类:


/*** @author lichong* 2022年07月25日14:48:47*/
public class MeasureUtil {/*** 测量文字的宽度* */public static float measureTextWidth(String txt,int size){Paint paint=new Paint();paint.setTextSize(size);return paint.measureText(txt);}public static Rect measureTextRectByBounds(String str){Paint paint = new Paint();Rect rect = new Rect();paint.getTextBounds(str, 0, str.length(), rect);int w = rect.width();int h = rect.height();return rect;}public static int measureTextWidthByBounds(String str){return measureTextRectByBounds(str).width();}public static int measureTextHeightByBounds(String str){return measureTextRectByBounds(str).height();}// 获取指定文本的高度public static float getTextHeight(String text, float textSize) {Paint paint = new Paint(); // 创建一个画笔对象paint.setTextSize(textSize); // 设置画笔的文本大小Paint.FontMetrics fm = paint.getFontMetrics(); // 获取画笔默认字体的度量衡return fm.descent - fm.ascent; // 返回文本自身的高度//return fm.bottom - fm.top + fm.leading;  // 返回文本所在行的行高}

扩展:

Canvas指画布,表现在屏幕上就是一块区域,可以在上面使用各种API绘制想要的东西
Canvas的坐标系:

画布以左上角为原点(0,0),向右为X轴的正方向,向下为Y轴的正方向

Canvas的绘图操作:

绘制颜色 drawColor、drawRGB、drawARGB

绘制圆 drawCircle

绘制点 drawPoint

绘制直线 drawLine

绘制矩形 drawRect

绘制圆角矩形 drawRoundRect

绘制椭圆 drawOval

绘制弧形 drawArc

绘制文本 drawText

沿Path路径绘制文本 drawTextOnPath

绘制位图 drawBitmap

//绘制颜色
public void drawColor(@ColorInt int color)
public void drawRGB(int r, int g, int b)
public void drawARGB(int a, int r, int g, int b)//绘制圆
public void drawCircle(float cx, float cy, float radius, @NonNull Paint paint)//绘制点
public void drawPoint(float x, float y, @NonNull Paint paint)
//绘制多个点
public void drawPoints(@Size(multiple = 2) @NonNull float[] pts, @NonNull Paint paint)//绘制一条直线
public void drawLine(float startX, float startY, float stopX, float stopY, @NonNull Paint paint)
//绘制多条直线
public void drawLines(@Size(multiple = 4) @NonNull float[] pts, @NonNull Paint paint)//绘制一个矩形
public void drawRect(@NonNull RectF rect, @NonNull Paint paint)
public void drawRect(@NonNull Rect r, @NonNull Paint paint)
public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint)//绘制一个圆角矩形
public void drawRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Paint paint)
public void drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, @NonNull Paint paint)//绘制一个椭圆
public void drawOval(@NonNull RectF oval, @NonNull Paint paint)
public void drawOval(float left, float top, float right, float bottom, @NonNull Paint paint)//绘制一个弧形
public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint)
public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint)//绘制文本
public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint)
//沿Path路径绘制文本
public void drawTextOnPath(@NonNull String text, @NonNull Path path, float hOffset, float vOffset, @NonNull Paint paint)//绘制位图
public void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint)
public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull RectF dst, @Nullable Paint paint)

参考:
https://blog.csdn.net/zenmela2011/article/details/123458194

https://blog.csdn.net/xujian197/article/details/79903544

【Android】ImageView图片装饰 文字、水印、边框(94/100)相关推荐

  1. android图片上加有汉字,Android 为图片添加文字水印

    先上图: 上代码 ------------------------MainActivity------------------------ package com.example.zhuoshi.wa ...

  2. Android 为图片添加文字水印

    先上图: 上代码 ------------------------MainActivity------------------------ package com.example.zhuoshi.wa ...

  3. Android常用实例——截取APP当前界面(可带图片、文字水印)

    Android常用实例--截取APP当前界面(可带图片.文字水印) 标签: android界面截图保存图片 2016-08-16 10:52 1262人阅读 评论(2) 收藏 举报  分类: Andr ...

  4. android水印控件,Android图片添加文字水印并保存水印文字图片到指定文件

    Android图片添加文字水印并保存水印文字图片到指定文件package zhangphil.test;import android.graphics.Bitmap;import android.gr ...

  5. Swift - 给图片添加文字水印(图片上写文字,并可设置位置和样式)

    想要给图片添加文字水印或者注释,我们需要实现在UIImage上写字的功能. 1,效果图如下: (在图片左上角和右下角都添加了文字.) 2,为方便使用,我们通过扩展UIImage类来实现添加水印功能 ( ...

  6. Springboot中给图片添加文字水印

    Springboot中给图片添加文字水印 工作中遇到给图片添加文字水印的需求,记录下来方便之后查阅 需求内容: 给一张图片添加指定文字水印,使一张图片上有多个水印内容,并且设定一个水印开关,可指定是否 ...

  7. php生成背景并加字,PHP给图片添加文字水印实例

    PHP给图片添加文字水印实例,支持中文文字水印,是否覆盖原图,自定义设置水印背景色.文字颜色.字体等. 水印类water.class.php var $Path = "./"; / ...

  8. php图片添加代码,php图片添加文字水印实现代码_php技巧

    php类库给现有的图片加文字水印,代码不是很完善,欢迎大家多多指教!代码如下: img(图片路径,水印文字,字体路径,字体大小,字体角度); 比如:$tpl->img('abc.jpg','这是 ...

  9. PHP实现给图片加文字水印

    PHP实现给图片加文字水印 一.开发环境 1.Windows+Apache+MySQL+PHP的环境. 2.文本编辑器:Sublime. 二.主要技术 PHP+HTML+CSS 三.效果图与具体步骤 ...

最新文章

  1. semantic-ui-react图像组件不显示图像的问题
  2. 6、检查约束(CHECK)
  3. python装饰器怎么编程_Python编程:Python装饰器入门
  4. 在哪儿能找c语言编程题,C语言程序设计的试题及答案
  5. helm3安装mysql_Helm3(kubernetes包管理工具)安装使用踩坑指南
  6. CSS 匿名文本和匿名框
  7. 嵌入式在线html编辑器,嵌入式HTML编辑器的设计与实现.ppt
  8. php如何把图片铺满,PHP如何裁剪图片成固定大小
  9. liferay控制面板--网页内容时间不一致问题解决思路
  10. android-support-v7-appcompat下载
  11. PAIP.AHK调试以及同于脚本的调试法
  12. nodejs mysql 执行多条sql语句
  13. 2021年了!!Xshell7新手下载和安装教程(步骤超详细),以及远程与虚拟机连接
  14. 屏蔽群晖系统升级并去除群晖桌面小红点
  15. linux 开根号函数,Linux里隐藏的计算器开根号,问他它的地球未解之谜吗?
  16. 剑侠世界2不显示服务器,剑侠世界2去哪个服务器好_哪个区人多问题说明_软吧...
  17. 外媒介绍全新表情密码 用emoji解锁安全吗?
  18. 曾国藩:读书、交友、处事、养性,都在这里了
  19. 肖维勒准则matlab_莱因达 ( PauTa)准则、格拉布斯 ( Grubbs)准则、肖维纳 (Chauvenet)准则 三者的区别...
  20. STM32 Cube ADC 测量土壤湿度

热门文章

  1. Python海龟绘图法详解
  2. 甘肃陇南破“行路难” 连接珠三角融入长江经济带
  3. VNPY实盘交易中,出现发单成功但是没有交易情况
  4. 跟踪算法STAPLE
  5. android asynctask,Android AsyncTask原理解析
  6. 超级手电筒最亮的_超亮手电筒app手机版下载_手机强光亮手电筒下载66.36.138-麦块安卓网...
  7. WINXP系统服务详解
  8. 孙叫兽重磅推荐Chrome插件——CSDN浏览器助手
  9. 神州数码-路由器基本配置
  10. 《第一行代码》 编写精美的聊天界面