日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 自定义View消除锯齿实现图片旋转,添加边框及文字说明

發(fā)布時(shí)間:2023/12/15 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 自定义View消除锯齿实现图片旋转,添加边框及文字说明 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

先看看圖片的效果,左邊是原圖,右邊是旋轉(zhuǎn)之后的圖;

?

之所以把這個(gè)寫出來是因?yàn)樵谝粋€(gè)項(xiàng)目中需要用到這樣的效果,我試過用FrameLayout布局如上的畫面,然后旋轉(zhuǎn)FrameLayout,隨之而來也就存在了一些問題——鋸齒!

在網(wǎng)上搜索之后,有兩種方法,一是利用Paint,二是利用Canvas;
(1)、paint.setAntiAlias(true);

   paint.setFlags(Paint.ANTI_ALIAS_FLAG);

(2)、DrawFilter?pfdf = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);

   canvas.setDrawFilter(pfdf);

而如果利用paint,或者canvas,需要從哪獲取paint/canvas,這也是一個(gè)問題;

在實(shí)現(xiàn)的過程中,嘗試過自定義FrameLayout下面的單個(gè)View{ImageView,TextView},但都以失敗告終,失敗的主要問題在于右圖下邊的文字描述無法和相片邊框相對齊,而且用Matrix旋轉(zhuǎn)背景之后背景大小改變,位置也不在最下邊,所以就采用了單獨(dú)實(shí)現(xiàn)一個(gè)View的方法,主要原因還是因?yàn)樽陨韺anvas繪圖及Paint畫筆不是很熟悉,所以導(dǎo)致的效率不高;

public class RotateTextImageView extends View {PaintFlagsDrawFilter pfdf;Paint paint;Matrix matrix;Bitmap bitmap;int index = -1;private int oriHeight;private int oriWidth;private int newHeight;private int newWidth;private int angle = 5;protected Path path = new Path();private float[] f = new float[8];private int shawHeight = 20;private int borderSize = 8;Bitmap oriBitmap;private String text = "";public RotateTextImageView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initCanvasInfo();}public RotateTextImageView(Context context, AttributeSet attrs) {super(context, attrs);initCanvasInfo();}public RotateTextImageView(Context context) {super(context);initCanvasInfo();}/*** 初始化Paint*/protected void initCanvasInfo() {pfdf = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG| Paint.FILTER_BITMAP_FLAG);paint = new Paint();paint.setAntiAlias(true);matrix = new Matrix();matrix.setRotate(5);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);paint.reset();// 消除鋸齒paint.setAntiAlias(true);paint.setFlags(Paint.ANTI_ALIAS_FLAG);canvas.setDrawFilter(pfdf);canvas.drawBitmap(bitmap, 0, 0, paint);newHeight = bitmap.getHeight();newWidth = bitmap.getWidth();calculatePoints();// 添加陰影 path.reset();path.moveTo(f[0], f[1]);path.lineTo(f[2], f[3]);path.lineTo(f[4], f[5]);path.lineTo(f[6], f[7]);path.close();paint.setStyle(Paint.Style.FILL_AND_STROKE);paint.setColor(Color.parseColor("#96ffffff"));canvas.drawPath(path, paint);// 添加字符if (text != null && !text.equals("")) {path.reset();paint.setTextSize(18);float width = paint.measureText(text);path.moveTo((f[0] + f[2]) / 2, (f[1] + f[3]) / 2);path.lineTo((f[4] + f[6]) / 2, (f[5] + f[7]) / 2);paint.setColor(Color.parseColor("#2b2b2b"));canvas.drawTextOnPath(text, path, (oriWidth - width) / 2, 3, paint);}layout(0, 0, newWidth, newHeight);}/*** 計(jì)算坐標(biāo)值*/private void calculatePoints() {double a = angle * Math.PI / 180;BigDecimal height = new BigDecimal(oriHeight);BigDecimal width = new BigDecimal(oriWidth);BigDecimal cos = new BigDecimal(Math.cos(a));BigDecimal tan = new BigDecimal(Math.tan(a));f[0] = 0;f[1] = height.multiply(cos).floatValue();f[2] = tan.multiply(new BigDecimal(shawHeight)).floatValue();f[3] = (new BigDecimal(f[1])).subtract(new BigDecimal(shawHeight)).floatValue();f[4] = width.multiply(cos).add(new BigDecimal(f[2])).floatValue();f[5] = new BigDecimal(newHeight - shawHeight).floatValue();f[6] = width.multiply(cos).floatValue();f[7] = new BigDecimal(newHeight).floatValue();}/*** 設(shè)置圖片* * @param bmp*/public void setBitmap(Bitmap bmp) {oriBitmap = bmp;matrix.reset();matrix.setRotate(angle);Bitmap bitmapF = addFrame(bmp);oriHeight = bitmapF.getHeight();oriWidth = bitmapF.getWidth();bitmap = Bitmap.createBitmap(bitmapF, 0, 0, bitmapF.getWidth(),bitmapF.getHeight(), matrix, true);postInvalidate();}/*** 旋轉(zhuǎn)角度* * @param angle*/public void setAngle(int angle) {this.angle = angle;setBitmap(oriBitmap);}/*** 設(shè)置底部陰影高度* * @param shawHeight*/public void setShawHeight(int shawHeight) {this.shawHeight = shawHeight;postInvalidate();}/*** 生成添加了白色邊緣的圖* * @param bmp* @return*/protected Bitmap addFrame(Bitmap bmp) {Bitmap bmpWithBorder = Bitmap.createBitmap(bmp.getWidth() + borderSize* 2, bmp.getHeight() + borderSize * 2, bmp.getConfig());Canvas canvas = new Canvas(bmpWithBorder);canvas.drawColor(Color.WHITE);canvas.drawBitmap(bmp, borderSize, borderSize, null);return bmpWithBorder;}/*** 設(shè)置字符串* * @param text*/public void setText(String text) {this.text = text;postInvalidate();}/*** 獲取字體高度*/protected int getFontHeight() {FontMetrics fm = paint.getFontMetrics();return (int) Math.ceil(fm.descent - fm.top) + 2;} }

?

  代碼解釋:其實(shí)沒有什么難的東西,只是一些數(shù)學(xué)運(yùn)算,代碼中每一個(gè)方法都有對應(yīng)的功能注釋。浮點(diǎn)型數(shù)組代表陰影層四個(gè)坐標(biāo)點(diǎn)的八個(gè)坐標(biāo)值,分別是左下、左上、右上、右下四個(gè)點(diǎn),陰影層坐標(biāo)計(jì)算也比較簡單,但有點(diǎn)繁瑣,就是把原圖旋轉(zhuǎn)之后再根據(jù)幾何知識進(jìn)行求解坐標(biāo)!

  每次重新設(shè)置角度,設(shè)置圖片,都需要重新繪制圖形-->postInvalidate();

View的使用

一、xml配置文件

<com.livingstone.RotateTextImageViewandroid:id="@+id/myview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:minHeight="250dip"android:minWidth="200dip"android:paddingLeft="5dip" />

二、設(shè)置文字說明及角度、圖片

RotateTextImageView myView = (RotateTextImageView) findViewById(R.id.myview);myView.setShawHeight(50);Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.test1);myView.setBitmap(bmp);myView.setAngle(10);myView.setText("這是一個(gè)測試");

?

Ex:獲取字體寬度的兩種方法
<1>.通過paint獲取字體的Rect

Rect rect=newRect(); paint.getTextBounds("你好",0,1, rect); Log.v("a:","height:"+rect.height()+"width:"+rect.width());

<2>.通過paint直接獲取字體寬度

intwidth=(int)paint.measureText("你好",0,1); Log.v("width:","width:"+width);

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/a284628487/p/3377925.html

總結(jié)

以上是生活随笔為你收集整理的Android 自定义View消除锯齿实现图片旋转,添加边框及文字说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩精品手机在线 | 日韩影院一区二区 | 天天干天天操天天插 | aaa毛片视频 | 天堂成人国产精品一区 | 自拍偷拍p| 黄色在线视频网站 | 天天操天天操天天操天天操天天操 | 亚洲福利视频在线 | 男ji大巴进入女人视频 | 综合久久伊人 | 免费黄色av网址 | 杨幂毛片午夜性生毛片 | 国产精品一区二区免费视频 | a级性生活视频 | 国产精品99久久 | 一个色在线视频 | 李华月全部毛片 | 中国精品久久 | 99色国产 | 久久77| 影音先锋黄色网址 | 国产成人福利 | 女王人厕视频2ⅴk | 肉丝美脚视频一区二区 | 久久久av免费 | 欧美另类一区 | 91精品国产一区二区三区 | 久久午夜精品视频 | 欧美第一页浮力影院 | 久久久久区 | 久久99精品国产麻豆婷婷洗澡 | 日韩1级片| 青青操视频在线观看 | 国产美女在线播放 | 免费啪啪网| 国产人妻人伦精品1国产盗摄 | 涩涩资源网 | 同心兄弟 | 久久九九视频 | 国产精品免费大片 | 红桃视频国产 | 精品欧美一区二区久久久久 | 51啪影院 | 国产欧洲亚洲 | 性色av蜜臀av浪潮av老女人 | 中文字幕亚洲欧美日韩在线不卡 | 91高清在线免费观看 | 精品人妻二区中文字幕 | 国产精品久久久久久久久免费看 | 香蕉911| 国产高潮在线 | 中文不卡av | 日韩美女免费视频 | 国产内射合集颜射 | 夜夜精品视频 | 操色网 | 日本少妇影院 | 综合激情四射 | 国产视频精品一区二区三区 | 色噜噜狠狠狠综合曰曰曰88av | 手机看片日韩 | 国产美女喷水视频 | 国产福利视频一区二区 | 男生尿隔着内裤呲出来视频 | 在线观看黄网址 | 日韩中文字幕一区二区 | 久久一区二 | 美女扒开尿口给男人捅 | 国产999精品久久久久久 | 欧美少妇性生活 | 噜噜噜在线 | 欧美国产一区二区三区 | 国产在成人精品线拍偷自揄拍 | 亚洲免费中文 | 黄色小说在线观看视频 | 欧美一区二区三区不卡视频 | 怡红院精品视频 | 国产成人久久婷婷精品流白浆 | 蜜桃精品久久久久久久免费影院 | 天堂网2018| 激情久久五月 | 免费成人黄色网 | 亚洲一区二区三区激情 | 色欲无码人妻久久精品 | av在线综合网 | 精品一区二区欧美 | 91视频精选 | 一区二区三区免费视频观看 | 不卡的av网站 | 久久亚洲综合色 | 久久日精品 | 欧美午夜精品久久久久久浪潮 | 欧美不在线 | 国产一区二区三区四区五区六区 | 国产熟妇一区二区三区四区 | 国产在线播放一区 | 熟女国产精品一区二区三 | 亚洲欲妇 |