日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲影院中文字幕 | 校园伸入裙底揉捏1v1h | 国产黄色免费视频 | 亚洲成人少妇 | 吞精囗交69激情欧美 | 黄色性生活一级片 | 国产色片 | 欧美精品一级 | 日本xxxx18| 日本做爰全过程免费看 | 伊人网狼人 | 婷婷人体 | 91一区二区视频 | 337p粉嫩大胆噜噜噜噜69影视 | 在线免费观看a视频 | 色综合中文综合网 | 欧美日韩视频免费观看 | 久久久久久欧美精品se一二三四 | 好男人视频www | 欧美日韩国产综合在线 | 亚洲精品一区二区三区蜜臀 | 免费av一区二区三区 | 青娱乐在线视频免费观看 | 国产视频一区二区三区在线播放 | 欲涩漫入口免费网站 | 日韩在线视频网址 | 尤物视频在线观看国产 | 久热精品视频在线播放 | 69天堂网| 日韩精彩视频在线观看 | 少妇名器的沉沦 | 国产亚洲久一区二区 | 精品久久久久久久久久久久久久久久久 | 人人看人人模 | 美女一级黄 | 色偷偷av一区二区三区 | 中国久久久 | 中文字幕乱码中文乱码777 | 99精品免费在线观看 | 婷婷色吧 | www狠狠干| 国产三级伦理片 | 国内精品视频一区 | 色干干 | 欧美性猛交xxxx乱大交 | 女同一区二区 | 嫩草视频在线观看免费 | 成av在线 | 天天视频天天爽 | 网站黄在线观看 | 91久久久久久久久久久 | 国产网站免费 | 欧美黄色一级生活片 | 国产精品久久久久久久久久久久久久久久 | 欧美性生活精品 | 国产jizz | bbbbbxxxxx性欧美 | 男女啪啪在线观看 | 性xxxx欧美 | 成人免费91 | 乡村乱淫 | 五月网站| 国产一区精品在线 | 精品午夜一区二区三区在线观看 | 国产搞逼视频 | 日韩av手机在线观看 | 国产欧美一区二区精品性色 | 欧美日韩国产专区 | 色四月婷婷 | 日韩一卡二卡三卡四卡 | 日本特级黄色录像 | 高清国产mv在线观看 | 香蕉久久精品 | 超碰在线网站 | 亚洲 欧美 自拍偷拍 | 国产又黄又猛又爽 | 天天色综合影视 | 新天堂av| 瑟瑟视频免费看 | 国产精品一区二区人妻喷水 | 精品国产一区二区三区久久 | 国产精品免费视频一区二区 | 污片免费网站 | av小说免费在线观看 | 免费av电影网址 | 99热国 | 天堂伊人 | 天堂视频网 | 九热这里只有精品 | 豆花免费跳转入口官网 | 成人免费黄色片 | 国产美女作爱视频 | 国产在线毛片 | 99热国产在线 | 一个人看的www视频在线观看 | 素人一区二区三区 | 国产91精品久久久久 | 人妻丰满熟妇av无码久久洗澡 | 午夜伦理av |