最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

鴻蒙HarmonyOS App開發(fā)造輪子之自定義圓形圖片組件的實(shí)例代碼

 更新時(shí)間:2021年01月05日 10:54:07   作者:HarmonyOS技術(shù)社區(qū)  
這篇文章主要介紹了鴻蒙HarmonyOS App開發(fā)造輪子之自定義圓形圖片組件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、背景

在采用Java配合xml布局編寫鴻蒙app頁(yè)面的時(shí)候,發(fā)現(xiàn)sdk自帶的Image組件并不能將圖片設(shè)置成圓形,反復(fù)了翻閱了官方API手冊(cè)(主要查閱了Compont和Image相關(guān)的API),起初發(fā)現(xiàn)了一個(gè)setCornerRadius方法,于是想著將圖片寬度和高度設(shè)置為一樣,然后調(diào)用該方法將radios設(shè)置為寬度或者高度的一半,以為可以實(shí)現(xiàn)圓形圖片的效果,后來發(fā)現(xiàn)不行。于是乎想著能不能通過繼承原有的Image自己來動(dòng)手重新自定義一個(gè)支持圓形的圖片組件。

二、思路:

1、對(duì)比之前自己在其他程序開發(fā)中自定義組件的思路,首先尋找父組件Image和Component相關(guān)的Api,看看是否具備OnDraw方法。

2、了解Canvas相關(guān)Api操作,特別是涉及到位圖的操作。

通過翻閱大量資料,發(fā)現(xiàn)了兩個(gè)關(guān)鍵的api,分別是Component的addDrawTask方法和其內(nèi)部靜態(tài)接口DrawTask

三、自定義組件模塊

1、新建一個(gè)工程之后,創(chuàng)建一個(gè)獨(dú)立的Java FA模塊,然后刪除掉里面所有布局以及自動(dòng)生成的java代碼,然后自己創(chuàng)建一個(gè)class繼承ImageView

2、寫一個(gè)類繼承ImageView,在其中暴露出public的設(shè)置圓形圖片的api方法以供后面調(diào)用;

3、在原有的Image組件獲取到位圖之后,利用該位圖數(shù)據(jù)利用addDrawTask方法配合Canvas進(jìn)行位圖輸出形狀的重新繪制,這里需要使用Canvas的一個(gè)

關(guān)鍵api方法drawPixelMapHolderRoundRectShape;

4、注意,為了讓Canvas最后輸出的圖片為圓形,需要將圖片在布局中的寬度和高度設(shè)置成一樣,否則輸出的為圓角矩形或者橢圓形。

最后封裝后的詳細(xì)代碼如下:

package com.xdw.customview;

import ohos.agp.components.AttrSet;
import ohos.agp.components.Image;
import ohos.agp.render.PixelMapHolder;
import ohos.agp.utils.RectFloat;
import ohos.app.Context;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.media.image.ImageSource;
import ohos.media.image.PixelMap;
import ohos.media.image.common.PixelFormat;
import ohos.media.image.common.Rect;
import ohos.media.image.common.Size;

import java.io.InputStream;

/**
 * Created by 夏德旺 on 2021/1/1 11:00
 */
public class RoundImage extends Image {
 private static final HiLogLabel LABEL = new HiLogLabel(HiLog.DEBUG, 0, "RoundImage");
 private PixelMapHolder pixelMapHolder;//像素圖片持有者
 private RectFloat rectDst;//目標(biāo)區(qū)域
 private RectFloat rectSrc;//源區(qū)域
 public RoundImage(Context context) {
 this(context,null);

 }

 public RoundImage(Context context, AttrSet attrSet) {
 this(context,attrSet,null);
 }

 /**
 * 加載包含該控件的xml布局,會(huì)執(zhí)行該構(gòu)造函數(shù)
 * @param context
 * @param attrSet
 * @param styleName
 */
 public RoundImage(Context context, AttrSet attrSet, String styleName) {
 super(context, attrSet, styleName);
 HiLog.error(LABEL,"RoundImage");
 }

public void onRoundRectDraw(int radius){
 //添加繪制任務(wù)
 this.addDrawTask((view, canvas) -> {
  if (pixelMapHolder == null){
  return;
  }
  synchronized (pixelMapHolder) {
  //給目標(biāo)區(qū)域賦值,寬度和高度取自xml配置文件中的屬性
  rectDst = new RectFloat(0,0,getWidth(),getHeight());
  //繪制圓角圖片
  canvas.drawPixelMapHolderRoundRectShape(pixelMapHolder, rectSrc, rectDst, radius, radius);
  pixelMapHolder = null;
  }
 });
 }

 //使用canvas繪制圓形
 private void onCircleDraw(){
 //添加繪制任務(wù),自定義組件的核心api調(diào)用,該接口的參數(shù)為Component下的DrawTask接口
 this.addDrawTask((view, canvas) -> {
  if (pixelMapHolder == null){
  return;
  }
  synchronized (pixelMapHolder) {
  //給目標(biāo)區(qū)域賦值,寬度和高度取自xml配置文件中的屬性
  rectDst = new RectFloat(0,0,getWidth(),getHeight());
  //使用canvas繪制輸出圓角矩形的位圖,該方法第4個(gè)參數(shù)和第5個(gè)參數(shù)為radios參數(shù),
  // 繪制圖片,必須把圖片的寬度和高度先設(shè)置成一樣,然后把它們?cè)O(shè)置為圖片寬度或者高度一半時(shí)則繪制的為圓形
  canvas.drawPixelMapHolderRoundRectShape(pixelMapHolder, rectSrc, rectDst, getWidth()/2, getHeight()/2);
  pixelMapHolder = null;
  }
 });
 }

/**
 *獲取原有Image中的位圖資源后重新檢驗(yàn)繪制該組件
 * @param pixelMap
 */
 private void putPixelMap(PixelMap pixelMap){
 if (pixelMap != null) {
  rectSrc = new RectFloat(0, 0, pixelMap.getImageInfo().size.width, pixelMap.getImageInfo().size.height);
  pixelMapHolder = new PixelMapHolder(pixelMap);
  invalidate();//重新檢驗(yàn)該組件
 }else{
  pixelMapHolder = null;
  setPixelMap(null);
 }
 }

 /**
 * 通過資源ID獲取位圖對(duì)象
 **/
 private PixelMap getPixelMap(int resId) {
 InputStream drawableInputStream = null;
 try {
  drawableInputStream = getResourceManager().getResource(resId);
  ImageSource.SourceOptions sourceOptions = new ImageSource.SourceOptions();
  sourceOptions.formatHint = "image/png";
  ImageSource imageSource = ImageSource.create(drawableInputStream, null);
  ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions();
  decodingOptions.desiredSize = new Size(0, 0);
  decodingOptions.desiredRegion = new Rect(0, 0, 0, 0);
  decodingOptions.desiredPixelFormat = PixelFormat.ARGB_8888;
  PixelMap pixelMap = imageSource.createPixelmap(decodingOptions);
  return pixelMap;
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  try{
  if (drawableInputStream != null){
   drawableInputStream.close();
  }
  }catch (Exception e) {
  e.printStackTrace();
  }
 }
 return null;
 }

 /**
 * 對(duì)外調(diào)用的api,設(shè)置圓形圖片方法
 * @param resId
 */
 public void setPixelMapAndCircle(int resId){
 PixelMap pixelMap = getPixelMap(resId);
 putPixelMap(pixelMap);
 onCircleDraw();
 }

 /**
 * 對(duì)外調(diào)用的api,設(shè)置圓角圖片方法
 * @param resId
 * @param radius
 */
 public void setPixelMapAndRoundRect(int resId,int radius){
 PixelMap pixelMap = getPixelMap(resId);
 putPixelMap(pixelMap);
 onRoundRectDraw(radius);
 }
}

到此這篇關(guān)于鴻蒙HarmonyOS App開發(fā)造輪子之自定義圓形圖片組件的文章就介紹到這了,更多相關(guān)鴻蒙HarmonyOS自定義圓形圖片組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring AOP自定義注解方式實(shí)現(xiàn)日志管理的實(shí)例講解

    spring AOP自定義注解方式實(shí)現(xiàn)日志管理的實(shí)例講解

    下面小編就為大家分享一篇spring AOP自定義注解方式實(shí)現(xiàn)日志管理的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • java自帶排序使用

    java自帶排序使用

    這篇文章主要給大家分享了java自帶排序使用,該方法是升序排序,方法的內(nèi)部采用了快排實(shí)現(xiàn),但該方法是?穩(wěn)定的。下面一起來看看文章的詳細(xì)介紹吧
    2021-12-12
  • 使用Java8實(shí)現(xiàn)觀察者模式的方法(上)

    使用Java8實(shí)現(xiàn)觀察者模式的方法(上)

    本文給大家介紹使用java8實(shí)現(xiàn)觀察者模式的方法,涉及到j(luò)ava8觀察者模式相關(guān)知識(shí),對(duì)此感興趣的朋友一起學(xué)習(xí)吧
    2016-02-02
  • 用Java實(shí)現(xiàn)小球碰壁反彈的簡(jiǎn)單實(shí)例(算法十分簡(jiǎn)單)

    用Java實(shí)現(xiàn)小球碰壁反彈的簡(jiǎn)單實(shí)例(算法十分簡(jiǎn)單)

    下面小編就為大家?guī)硪黄肑ava實(shí)現(xiàn)小球碰壁反彈的簡(jiǎn)單實(shí)例(算法十分簡(jiǎn)單)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • java 如何給對(duì)象中的包裝類設(shè)置默認(rèn)值

    java 如何給對(duì)象中的包裝類設(shè)置默認(rèn)值

    這篇文章主要介紹了java 如何給對(duì)象中的包裝類設(shè)置默認(rèn)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • JDBC編程實(shí)現(xiàn)文件、圖片的存儲(chǔ)方法

    JDBC編程實(shí)現(xiàn)文件、圖片的存儲(chǔ)方法

    這篇文章主要介紹了JDBC編程實(shí)現(xiàn)文件、圖片的存儲(chǔ)方法,以實(shí)例形式分析了Java基于JDBC操作數(shù)據(jù)庫(kù)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • 關(guān)于JWT之token令牌認(rèn)證登錄

    關(guān)于JWT之token令牌認(rèn)證登錄

    這篇文章主要介紹了關(guān)于JWT之token令牌認(rèn)證登錄,使用JWT能夠保證Token的安全性,且能夠進(jìn)行Token時(shí)效性的檢驗(yàn),使用JWT時(shí),登錄成功后將用戶信息生成一串令牌字符串,需要的朋友可以參考下
    2023-05-05
  • Java攔截器、過濾器和監(jiān)聽器的區(qū)別與作用詳解

    Java攔截器、過濾器和監(jiān)聽器的區(qū)別與作用詳解

    Java 攔截器、過濾器和監(jiān)聽器是在 Java Web 開發(fā)中常用的組件,它們各有特點(diǎn)和用途,下面將分別介紹它們的區(qū)別和作用,并提供具體的代碼示例,需要的朋友可以參考下
    2025-06-06
  • JavaScript實(shí)現(xiàn)貪吃蛇游戲

    JavaScript實(shí)現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • spring強(qiáng)行注入和引用實(shí)例解析

    spring強(qiáng)行注入和引用實(shí)例解析

    這篇文章主要介紹了spring強(qiáng)行注入和引用實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

绵阳市| 云阳县| 吴桥县| 镇巴县| 周口市| 仪征市| 金沙县| 峨山| 奉贤区| 巴中市| 永年县| 陵川县| 铜陵市| 芜湖市| 通江县| 横山县| 丰都县| 香港 | 天峻县| 大悟县| 蒙城县| 盘山县| 连山| 白朗县| 三门峡市| 福清市| 绍兴县| 山西省| 江津市| 永年县| 桐柏县| 二手房| 德庆县| 三河市| 聊城市| 称多县| 砀山县| 合江县| 阜平县| 兰溪市| 师宗县|