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

Android利用Xfermode剪裁圓角

 更新時間:2022年05月19日 17:16:53   作者:碼仔時光  
這篇文章主要為大家詳細介紹了Android利用Xfermode剪裁圓角,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

通常的圖片圓角一般是對單獨的圖片進行切圓角操作,但是像下圖的效果就沒那么合適了,雖然對單張圖片切圓角也能實現,但更為繁瑣、不簡潔,因為數據內容是動態(tài)的,要根據數據源分很多種情況判斷哪張圖片該切哪個角。

所以,我在想能不能就在外層容器的四個角切圓角而不用管內部圖片的圓角情況呢?答案顯然是能!主要思路就是自定義一個layout,在dispatchDraw的時候將數據圖片的canvas與圓角bitmap混合,設置Xfermode為PorterDuff.Mode.DST_IN使交集部分展示即可達到圖示的效果

關鍵代碼(根據后臺數據生成里面的每個item相關代碼沒有貼,根據業(yè)務場景改變即可):

public class HotCityView extends LinearLayout {
? ? private LinearLayout ll_item_container1, ll_item_container2;
? ? private int itemH, itemSpace;
? ? private int padding;
? ? private Paint clipPaint;
? ? private RectF clipRect;
? ? private Bitmap maskBitmap;
? ? private int cornerSize;

? ? public HotCityView(@NonNull Context context) {
? ? ? ? this(context, null);
? ? }

? ? public HotCityView(@NonNull Context context, @Nullable AttributeSet attrs) {
? ? ? ? this(context, attrs, 0);
? ? }

? ? public HotCityView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
? ? ? ? super(context, attrs, defStyle);

? ? ? ? setOrientation(VERTICAL);

? ? ? ? inflate(context, R.layout.m_layout_hot_city, this);

? ? ? ? padding = (int) getResources().getDimension(R.dimen.list_lr_margin1);
? ? ? ? setPadding(padding, 0, padding, 0);

? ? ? ? itemH = PixelUtil.dp2px(109);
? ? ? ? itemSpace = (int) getResources().getDimension(R.dimen.hot_item_space);
? ? ? ? cornerSize = PixelUtil.dp2px(8);

? ? ? ? ll_item_container1 = findViewById(R.id.m_hot_city_item_container1);
? ? ? ? ll_item_container2 = findViewById(R.id.m_hot_city_item_container2);

? ? ? ? clipPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
? ? ? ? clipPaint.setStyle(Paint.Style.FILL);
? ? }

? ? @Override
? ? protected void dispatchDraw(Canvas canvas) {
? ? ? ? if (clipRect == null || getMeasuredWidth() == 0) {
? ? ? ? ? ? clipRect = new RectF(padding, 0, getMeasuredWidth() - padding, getMeasuredHeight());

? ? ? ? ? ? maskBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_4444);
? ? ? ? ? ? Canvas c = new Canvas(maskBitmap);
? ? ? ? ? ? //在蒙版上畫需要覆蓋的圖形
? ? ? ? ? ? c.drawRoundRect(clipRect, cornerSize, cornerSize, clipPaint);
? ? ? ? }

? ? ? ? //保存還沒有繪制之前的圖層
? ? ? ? int layerId = canvas.saveLayer(clipRect, clipPaint, Canvas.ALL_SAVE_FLAG);
? ? ? ? //繪制底部圖層
? ? ? ? super.dispatchDraw(canvas);

? ? ? ? //設置混合模式,實現view的四個圓角
? ? ? ? clipPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
? ? ? ? canvas.drawBitmap(maskBitmap, 0, 0, clipPaint);
? ? ? ? clipPaint.setXfermode(null);
? ? ? ? //恢復之前的圖層,要不然背景是黑色的
? ? ? ? canvas.restoreToCount(layerId);
? ? }


? ? //這種方式也可以實現裁剪效果,但是需要5.0以上
? ? private void clipRoundView() {
? ? ? ? if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
? ? ? ? ? ? ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider() {
? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? public void getOutline(View view, Outline outline) {
? ? ? ? ? ? ? ? ? ? //修改outline為特定形狀
? ? ? ? ? ? ? ? ? ? outline.setRoundRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), cornerSize);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? };
? ? ? ? ? ? //重新設置形狀
? ? ? ? ? ? setOutlineProvider(viewOutlineProvider);
? ? ? ? ? ? //添加背景或者是ImageView的時候失效,添加如下設置
? ? ? ? ? ? setClipToOutline(true);
? ? ? ? }
? ? }
}

附各種Xfermode的效果(這張圖太經典了,按照命名規(guī)則其實很容易理解,無需記住,到用的時候查閱即可):

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android 自定義AlertDialog對話框樣式

    Android 自定義AlertDialog對話框樣式

    實際的項目開發(fā)當中,經常需要根據實際的需求來自定義AlertDialog。最近在開發(fā)一個WIFI連接的功能,點擊WIFI需要彈出自定義密碼輸入框,具體代碼大家參考下本文
    2017-09-09
  • RecyclerView自定義分割線

    RecyclerView自定義分割線

    這篇文章主要為大家詳細介紹了RecyclerView自定義分割線的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Android SlidingMenu使用和示例詳解

    Android SlidingMenu使用和示例詳解

    這篇文章主要介紹了Android SlidingMenu使用和示例詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • Android監(jiān)聽滑動控件實現狀態(tài)欄顏色切換

    Android監(jiān)聽滑動控件實現狀態(tài)欄顏色切換

    這篇文章給大家分享一個平時在滑動頁面經常遇到的效果:滑動過程動態(tài)修改狀態(tài)欄顏色,文中有詳細的示例代碼,對我們的學習或工作有一定的幫助,感興趣的小伙伴自己動手試試吧
    2023-08-08
  • Android自定義多節(jié)點進度條顯示的實現代碼(附源碼)

    Android自定義多節(jié)點進度條顯示的實現代碼(附源碼)

    這篇文章主要介紹了Android自定義多節(jié)點進度條顯示的實現代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • Android 如何使用SQLite保存數據

    Android 如何使用SQLite保存數據

    對于重復數據或結構化數據(例如聯系信息),將數據保存到數據庫是理想選擇,SQL 數據庫的主要原則之一是架構,即數據庫組織方式的正式聲明,本篇文章介紹在 Android 上使用 SQLite 數據庫,感興趣的朋友一起看看吧
    2024-03-03
  • Android開發(fā)之DiffUtil的使用詳解

    Android開發(fā)之DiffUtil的使用詳解

    這篇文章文給大家介紹了DiffUtil的使用,相信大家每位Android開發(fā)者們都知道谷歌最近更新了Support Library 24.2.0,而DiffUtil就是在這個版本添加的一個工具類。下面就跟著小編一起來看看,有需要的可以參考借鑒。
    2016-09-09
  • Android 內存泄漏的幾種可能總結

    Android 內存泄漏的幾種可能總結

    本文主要介紹 Android 內存泄漏的幾種可能進行總結,這里整理了八種可以性,并一一介紹,有需要的小伙伴可以參考下
    2016-09-09
  • Android通過ViewModel保存數據實現多頁面的數據共享功能

    Android通過ViewModel保存數據實現多頁面的數據共享功能

    這篇文章主要介紹了Android通過ViewModel保存數據實現多頁面的數據共享功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • Flutter之Timer實現短信驗證碼獲取60s倒計時功能的代碼

    Flutter之Timer實現短信驗證碼獲取60s倒計時功能的代碼

    這篇文章主要介紹了Flutter之Timer實現短信驗證碼獲取60s倒計時功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07

最新評論

桃园市| 登封市| 出国| 德州市| 南溪县| 三台县| 册亨县| 元江| 红桥区| 麦盖提县| 酒泉市| 吉木乃县| 新蔡县| 濉溪县| 铁岭县| 车险| 楚雄市| 美姑县| 鄂伦春自治旗| 崇文区| 嵩明县| 阳新县| 石景山区| 涪陵区| 高平市| 黔江区| 蒲城县| 曲阳县| 泰州市| 株洲市| 巴里| 锡林郭勒盟| 贞丰县| 临洮县| 汝阳县| 洪江市| 溆浦县| 平果县| 布拖县| 临清市| 朔州市|