Android繪制(一):來用shape繪出想要的圖形吧!

目錄

  • 前言
  • shape繪制
  • 矩形
  • 橢圓
  • 用shape繪制SeekBar
  • 最后

前言

在沒有UI設計師的時候, 或者是想簡單看下效果的時候, 用shape進行快速繪制是極好的! 官方文檔.


shape繪制

一共有四種shape: rectangle, oval, line, ring.

矩形

我們一個一個來看, 首先是矩形:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><!-- 尺寸 --><sizeandroid:width="160dp"android:height="80dp" /><!-- 顏色 --><!--<solid android:color="@color/colorPrimary" />--><!-- 內間距 --><paddingandroid:bottom="8dp"android:left="8dp"android:right="8dp"android:top="8dp" /><!-- 漸變 --><gradientandroid:angle="45"android:endColor="@color/colorPrimary"android:startColor="@color/colorAccent"android:type="linear" /><!-- 圓角 --><!--<corners android:radius="200dp" />--><!-- 圓角單獨設置 --><cornersandroid:bottomLeftRadius="0dp"android:bottomRightRadius="0dp"android:topLeftRadius="40dp"android:topRightRadius="40dp" /><!-- 描邊 --><strokeandroid:width="2dp"android:color="#666"android:dashGap="4dp"android:dashWidth="4dp" />
</shape>
復制代碼
  • 漸變gradient是會覆蓋顏色的, 如果你想要純色, 直接設置顏色值即可, 就是設置solid中的color.
  • 順帶一提, solid只有color一個參數.
  • 如果你沒有漸變gradient, 也不寫solid, 那么將會是空心的.
  • 漸變gradienttype參數有3個:
  • linear 線性漸變
  • sweep 掃描漸變
  • radial 放射漸變, 需要配合參數gradientRadius
  • 圓角corners可以直接設置radius, 也可以一個一個指定.
  • 描邊stroke的話不寫dashGap, dashWidth就會是實線, dashWidth代表虛線寬度, dashGap代表虛線間隔.
  • 內間距padding和尺寸size就不提了, 大家都懂的.

橢圓

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><!-- 尺寸 --><sizeandroid:width="160dp"android:height="80dp" /><!-- 顏色 --><!--<solid android:color="@color/colorPrimary" />--><!-- 內間距 --><paddingandroid:bottom="8dp"android:left="8dp"android:right="8dp"android:top="8dp" /><!-- 漸變 --><gradientandroid:centerColor="@color/colorPrimary"android:endColor="@color/colorPrimaryDark"android:startColor="@color/colorAccent"android:type="sweep" /><!-- 描邊 --><strokeandroid:width="1dp"android:color="#333" />
</shape>
復制代碼
  • 漸變是最多可以設置三種顏色, 意思一看便知了:
  • startColor
  • centerColor
  • endColor
  • 一般橢圓都會用來繪制實心的小圓點.

線就很簡單了:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="line"><!-- 描邊 --><strokeandroid:width="8dp"android:color="@color/colorPrimary"android:dashGap="8dp"android:dashWidth="6dp" />
</shape>
復制代碼

最后來看環, 它有些特有屬性:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:innerRadiusRatio="4"android:shape="ring"android:thicknessRatio="100"android:useLevel="false"><!-- 尺寸 --><sizeandroid:width="200dp"android:height="200dp" /><!-- 漸變 --><gradientandroid:angle="0"android:centerColor="@color/colorPrimaryDark"android:endColor="@color/colorPrimary"android:startColor="@color/colorAccent"android:type="sweep" /><!-- 描邊 --><strokeandroid:width="1dp"android:color="#777"android:dashGap="4dp"android:dashWidth="4dp" />
</shape>
復制代碼
  • thicknessRatio 指的是環厚度百分比, 默認是9, 比如說這里寬度是200dp, thicknessRatio是100, 環厚度就是200dp / 100 = 2dp. 當然, 你可以直接用thickness設置厚度.
  • innerRadiusRatio 是內環百分比, 默認是3, 就是指用寬度 / 百分比得到的值就是內環半徑. 同樣可以用innerRadius直接設置.

用shape繪制SeekBar

我知道有很多非常好看的自定義進度條, 但是我寫這個SeekBar是想補充下shape的使用, 用非常少量的代碼實現自定義進度條. 來看看效果圖:

  • 實現
<SeekBarandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="@dimen/eight_dp"android:max="200"android:maxHeight="@dimen/eight_dp"android:minHeight="@dimen/eight_dp"android:progressDrawable="@drawable/layout_progress"android:thumb="@drawable/shape_circle" />
復制代碼

簡單解釋下幾個要點屬性:

  • max代表進度條最大的值.
  • maxHeight, minHeight可以設置進度條寬度, 我喜歡稍微寬一點的.
  • thumb設置滑塊, 可以是圖片, 可以是shape寫的設置.
  • progressDrawable代表進度條的外觀, 可以是圖片, 可以是shape寫的設置.

再來看看滑塊和進度條外觀具體代碼, 進度條可以設置背景, 進度, 和第二進度. 滑塊的話, 你想畫成什么樣都行.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@android:id/background"><shape><corners android:radius="@dimen/four_dp" /><solid android:color="@android:color/darker_gray" /></shape></item><item android:id="@android:id/secondaryProgress"><clip><shape><corners android:radius="@dimen/four_dp" /><solid android:color="@color/colorAccent" /></shape></clip></item><item android:id="@android:id/progress"><clip><shape><corners android:radius="@dimen/four_dp" /><solid android:color="@android:color/holo_blue_light" /></shape></clip></item>
</layer-list>
復制代碼
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><solid android:color="@android:color/holo_blue_light" /><strokeandroid:width="@dimen/one_dp"android:color="@android:color/holo_blue_light" /><sizeandroid:width="@dimen/sixteen_dp"android:height="@dimen/sixteen_dp" />
</shape>
復制代碼

java部分的話, 用Handler實例postDelayed方法讓進度條跑起來就可以看到效果了. 這里設定50ms發一次消息.

findViewById(R.id.cv_start).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mRunnable == null) {mRunnable = new MyRunnable();mHandler.postDelayed(mRunnable, 0);}}
});findViewById(R.id.cv_stop).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mHandler.removeCallbacks(mRunnable);mRunnable = null;}
});
復制代碼
private class MyRunnable implements Runnable {@Overridepublic void run() {int progress = mSbTest.getProgress();mTvProgress.setText(String.valueOf(progress));mSbTest.setProgress(++progress);mSbTest.setSecondaryProgress(progress + 10);int progress2 = mSbTest2.getProgress();mTvProgress2.setText(String.valueOf(progress2));mSbTest2.setProgress(++progress2);mSbTest2.setSecondaryProgress(progress2 + 20);mHandler.postDelayed(this, 50);}
}
復制代碼

最后

我個人還是偏向用shape繪制的, 圖片一出理不好就是內存溢出啊, 形變啊, 還要注意分辨率, 真心頭大. 喜歡記得點贊哦, 暗中關注我也是可以的~


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254869.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254869.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254869.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

halcon sobel 邊緣檢測 sobel_dir

目錄sobel_dir&#xff08;算子&#xff09;描述參數sobel_dir&#xff08;算子&#xff09; sobel_dir - 使用Sobel算子檢測邊緣&#xff08;振幅和方向&#xff09;。 sobel_dir(Image : EdgeAmplitude, EdgeDirection : FilterType, Size : ) 描述 sobel_dir計算圖像的一…

靜態鏈接庫LIB和動態鏈接庫DLL的區別 創建和示例

1.什么是靜態連接庫&#xff0c;什么是動態鏈接庫靜態鏈接庫與動態鏈接庫都是共享代碼的方式&#xff0c;如果采用靜態鏈接庫&#xff0c;則無論你愿不愿意&#xff0c; lib 中的指令都全部被直接包含在最終生成的 EXE 文件中了。 但是若使用 DLL&#xff0c;該 DLL 不必被包含…

【譯】x86程序員手冊37-第10章 初始化

Chapter 10 Initialization 第10章 初始化 After a signal on the RESET pin, certain registers of the 80386 are set to predefined values. These values are adequate to enable execution of a bootstrap program, but additional initialization must be performed by s…

在ubuntu中安裝minicom時出現device /dev/tty8 is locked解決辦法

未正常關閉minicom yesaiduywf-ubuntu: ~$ ls /var/lock LCK..ttyS0 subsys yesaiduywf-ubuntu: ~$ kill 0 yesaiduywf-ubuntu: ~$ ls /var/lock subsys yesaiduywf-ubuntu: ~$ sudo minicom Welcome to minicom 2.3 或者刪除/var/lock下面以LCK開頭的文件轉載于:https://www.…

秒殺多線程第二篇 多線程第一次親密接觸 CreateThread與_beginthreadex本質區別

本文將帶領你與多線程作第一次親密接觸&#xff0c;并深入分析CreateThread與_beginthreadex的本質區別&#xff0c;相信閱讀本文后你能輕松的使用多線程并能流暢準確的回答CreateThread與_beginthreadex到底有什么區別&#xff0c;在實際的編程中到底應該使用CreateThread還是…

halcon get_image_pointer1獲取圖像指針

目錄get_image_pointer1&#xff08;算子&#xff09;描述參數get_image_pointer1&#xff08;算子&#xff09; get_image_pointer1 - 訪問單通道圖像的指針。 get_image_pointer1(Image : : : Pointer, Type, Width, Height) 描述 運算符get_image_pointer1返回指向圖像I…

如何傳輸文件到linux服務器?

我們知道&#xff0c;云主機文件傳輸是一件相對復雜的事情&#xff0c;經常需要搭建FTP服務器或者是借助其他工具來完成。下面為大家介紹一種簡單易操作的傳輸文件到Linux服務器的方法。 Linux文件傳輸同Windows文件傳輸一樣&#xff0c;我們為每一臺Linux主機配置了一個1G的網…

C++學習筆記(五)--指針、NULL、引用

1. C中已經定義了NULL為0:#define NULL 0 指針p可以指向空值NULL即 p NULL;表示該指針變量不指向任何變量。   注意&#xff1a;指針未初始化與指針為NULL不同&#xff0c;   p NULL;是有值的&#xff0c;為0&#xff1b;   而在定義時&#xff1a;int *p;這時候碎雖然…

Sort函數的用法

快速排序sort的用法&#xff1a;&#xff08;適用于int float double char 。。。&#xff09; 記得加頭文件&#xff01; 記得加頭文件&#xff01; 記得加頭文件&#xff01; 頭文件&#xff1a; #include <algorithm> using namespace std ; // 兩行都要寫 數組排…

crf與bitrate對照表

crf與bitrate對照表 (2011-06-21 17:45:59)一些關于crf的備忘&#xff1a; 1、相較于bitrate方式&#xff0c;cpu占用與內存占用均會下降&#xff1b; 2、銳化濾鏡會讓crf的碼率上升&#xff1b; 3、vbv對crf依然有效&#xff1b; 4、crf18就接近無損&#xff0c;字幕組慣用20-…

秒殺多線程第三篇 原子操作 Interlocked系列函數

上一篇《多線程第一次親密接觸 CreateThread與_beginthreadex本質區別》中講到一個多線程報數功能。為了描述方便和代碼簡潔起見&#xff0c;我們可以只輸出最后的報數結果來觀察程序是否運行出錯。這也非常類似于統計一個網站每天有多少用戶登錄&#xff0c;每個用戶登錄用一個…

Vue 教程第九篇—— 動畫和過度效果

過渡效果 SPA 中組件的切換有一種生硬的隱藏顯示感覺&#xff0c;為了更好的用戶體驗&#xff0c;讓組件切換時淡出淡入&#xff0c;Vue 提供了專門的組件 transition。 過濾效果應用場景 條件渲染 (使用 v-if)條件展示 (使用 v-show)動態組件組件根節點過渡狀態 enter&#xf…

halcon create_ocr_class_svm 使用SVM分類器創建OCR分類器

目錄create_ocr_class_svm&#xff08;算子&#xff09;描述參數create_ocr_class_svm&#xff08;算子&#xff09; create_ocr_class_svm - 使用支持隨機向量機制創建OCR分類器。 create_ocr_class_svm&#xff08;:: WidthCharacter&#xff0c;HeightCharacter&#xff0…

碼率跟視頻質量有關系

碼率跟視頻質量有關系.首先要清楚, 相同的視頻編碼方式下, 碼率越高肯定畫面越清晰. 但是高到一定值, 再往上的畫面改善程度就不明顯了, 只會增大文件體積. 所以碼率選的合適, 才可以保證清晰度又保持文件不會太大. 個人經驗如果是h.264編碼(當前最好的視頻壓縮編碼方案), …

SQL 字符串分割表函數

1 --字符串分割表函數2 declare str varchar(1000)3 declare split varchar(10) 4 5 declare i int;6 declare count int;7 8 declare ChildStr varchar(1000);9 declare splitStr varchar(1000); 10 declare Index int; 11 12 declare table as table (rowId int,splitStr va…

語句:分支語句、switch case ——7月22日

語句的類型包括&#xff1a;聲明語句、表達式語句、選擇語句、循環語句、跳轉語句、異常語句 1&#xff0e;聲明語句引&#xff1a;入新的變量或常量。 變量聲明可以選擇為變量賦值。 在常量聲明中必須賦值。 例如&#xff1a; int i 0;//聲明變量i 并賦值&#xff0c;也可以不…

halcon write_ocr_trainf 將訓練字符存儲到文件中

目錄write_ocr_trainf&#xff08;運算符&#xff09;描述參數write_ocr_trainf&#xff08;運算符&#xff09; write_ocr_trainf - 將訓練字符存儲到文件中。 write_ocr_trainf&#xff08;Character&#xff0c;Image :: Class&#xff0c;TrainingFile ? 描述 運算符w…

碼率計算文章

http://bbs.dvbcn.com/showtopic-41431-1.html

PostgreSQL Oracle 兼容性之 - INDEX SKIP SCAN (遞歸查詢變態優化) 非驅動列索引掃描優化...

標簽 PostgreSQL , Oracle , index skip scan , 非驅動列條件 , 遞歸查詢 , 子樹 背景 對于輸入條件在復合索引中為非驅動列的&#xff0c;如何高效的利用索引掃描&#xff1f; 在Oracle中可以使用index skip scan來實現這類CASE的高效掃描&#xff1a; INDEX跳躍掃描一般用在W…

如何確定鏡頭CCD靶面尺寸?

在組建機器視覺系統時&#xff0c;需要選用適合實際應用的產品。今天&#xff0c;中國機器視覺商城的培訓課堂為您帶來的是關于工業鏡頭CCD靶面尺寸的確定方法。 在選擇鏡頭時&#xff0c;我們通常要注意一個原則&#xff1a;即小尺寸靶面的CCD可使用對應規格更大的鏡頭&#x…