動態給組件添加背景,一半圓角

来源:https://www.cnblogs.com/tangZH/archive/2018/01/17/8305063.html
-Advertisement-
Play Games

尊重勞動成果,轉載請標明出處:http://www.cnblogs.com/tangZH/p/8305063.html 我們在自定義view的時候有時候需要給組件一個背景,而這個背景可能是不規則的,比如一個紅色背景,但是左邊有圓角,右邊沒有,那麼應該怎麼做呢?在這裡我以textView為例。 用xm ...


尊重勞動成果,轉載請標明出處:http://www.cnblogs.com/tangZH/p/8305063.html 

 

我們在自定義view的時候有時候需要給組件一個背景,而這個背景可能是不規則的,比如一個紅色背景,但是左邊有圓角,右邊沒有,那麼應該怎麼做呢?在這裡我以textView為例。

用xml的方式很容易實現,不過我們這裡是在代碼中動態實現的。

 

先放上效果圖:

 

一開始的思路是直接在TextView上面繪製,但是這樣會出現一種情況,就是繪製完之後,字體就看不到了,所以我們還是得從背景入手,通過setBackgroundDrawable()方法給它一個背景,而這個背景是我們自己繪製出來的。Drawable類可以實現該效果:

1、畫筆和view

    /**
     * 畫背景的畫筆
     */
    private Paint mPaintBg;

    mPaintBg = new Paint();

    /**
     * textView
     */
    private TextView tv;

 

2、初始化畫筆:

//設置畫筆的顏色
mPaintBg.setColor(mContext.getResources().getColor(R.color.theme));
//類型為填充
mPaintBg.setStyle(Paint.Style.FILL);
//抗鋸齒
mPaintBg.setAntiAlias(true);
mPaintBg.setStrokeWidth(mContext.getResources().getDimension(R.dimen.size));

 

 2、設置Drawable 

 Drawable drawable = new Drawable() {
            @Override
            public void draw(@NonNull Canvas canvas) {
//在畫布上繪製背景(裡面有兩個參數,Path,Paint,mPaintBg為我們上面的畫筆,
//至於path,下麵會講)
canvas.drawPath(path, mPaintBg); } @Override
public void setAlpha(int i) { } @Override public void setColorFilter(@Nullable ColorFilter colorFilter) { } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } };

 

4、在家註意到了,上面的的代碼canvas.drawPath(path, mPaintBg);裡面參數有一個path,這個path是我們繪製的路徑。怎麼設置這個path呢?代碼如下:

RectF rectfBg;
Path path = new Path();
rectfBg = new RectF(0, 0, leftTv.getWidth(), leftTv.getHeight());
path.addRoundRect(rectfBg, new float[]{10, 10, 0, 0, 0, 0, 10, 10}, Path.Direction.CW);

 

這裡用到了Path的一個方法:

public void addRoundRect (RectF rect, float[] radii, Path.Direction dir)

增加一個閉合的圓角矩形到path當中

 

radii:表示各個角的半徑點x,y,依次是左上角,右上角,右下角,左下角,

rect:矩形位置

dir:繪製的方向,有兩種

Path.Direction.CW:順時針

Path.Direction.CCW:逆時針

最後把該Drawable設置給textView
tv.setBackgroundDrawable(drawable)

就此完成了。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 進程啟動順序 Oracle Grid Infrastructure由OS初始化守護程式啟動 操作系統初始化守護進程(init)->Grid Infrastructure包裝腳本(init.ohasd)->Grid Infrastructure守護程式和進程(ohasd.bin,oraagent.bi ...
  • 概述 本篇我們將利用DMA一步一步實現SQL Server 的遷移。幫助大家理解現在的SQL Server與新版本的融合問題,同時需要我們做哪些操作來實現新版本的升級或者遷移。 SQL Server 遷移 一定要有一個準備好的計劃,我下麵列出了所有的遷移過程需要做的工作,如下列表: 步驟列表 序號 ...
  • 最近群里聊起秒殺和限流,我自己沒有做過類似應用,但是工作中遇到過更大的數據和併發。 於是提出了一個簡單的模型: var count = rds.inc(key); if(count > 1000) throw "已搶光!" 藉助Redis單線程模型,它的inc是安全的,確保每次加一,然後返回加一後的 ...
  • 工作中,經常會遇到將某個數據表的所有或大部份欄位讀取出來情況,比如說跨資料庫進行表更新或插入等。假如欄位名一個一個地敲的話,一是效率低,二是會有漏掉的情況。 針對此種情況,處理的方法有很多種,比如新建一個視圖,在裡面錄入SELECT * FROM 表名,系統會自動將星號改成欄位名(SQL SERVE ...
  • 查詢資料庫中的表及列,依資料庫自帶的函數,一條語句就可以搞定: ...
  • sqlserver: with Result as ( select SUM(F_DayValue) AS F_Value,F_ZZ_ttBuildID,F_EnergyItemCode from T_EC_EnergyItemDayResult where F_EnergyItemCode lik... ...
  • 〓資料庫的分類〓 資料庫通常分為層次式資料庫、網路式資料庫和關係式資料庫三種。而不同的資料庫是按不同的數據結構來聯繫和組織的。 而在當今的互聯網中,最常見的資料庫模型主要是兩種,即關係型資料庫和非關係型資料庫。 資料庫分類 〓關係型資料庫介紹〓 1、關係型資料庫的由來 雖然網狀資料庫和層次資料庫已經 ...
  • 【轉】Android總結篇系列:Activity生命周期 Android官方文檔和其他不少資料都對Activity生命周期進行了詳細介紹,在結合資料和項目開發過程中遇到的問題,本文將對Activity生命周期進行一次總結。 Activity是由Activity棧進管理,當來到一個新的Activity ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...