當前位置:首頁 » 安卓系統 » androidxml自定義view

androidxml自定義view

發布時間: 2023-06-26 08:17:34

⑴ android自定義View組合控制項

需要看你實現什麼效果。一般自定義控制項可以用2種方式:
1.
將現有的控制項封裝起來,作為一個通用的組件來使用,此時只能用代碼的形式調用,無法再xml中引用,例如將textview和button封裝為一個登錄控制項。
2.
繼承view或者viewgroup,其實viewgroup也是繼承的view。然後依次實現onmeasure()、onlayout()、ondraw(),
1.
onmeasure
--
負責測繪控制項的大小
2.
onlayout
--
負責控制項中子元素擺放的位置
3.
ondraw
--
負責控制項和子控制項的繪制,使其顯示在屏幕中
4.
一些設計和實現較好的自定義view,一般還需要考慮事件的傳遞、動畫的控制、touch事件的處理等

⑵ android 自定義view 怎麼規定view的樣式

android 自定義view的樣式的實現:

1.在values文件夾下,打開attrs.xml,其實這個文件名稱可以是任意的,寫在這里更規范一點,表示裡面放的全是view的屬性。

2.因為我們下面的實例會用到2個長度,一個顏色值的屬性,所以我們這里先創建3個屬性。

<declare-styleable name="rainbowbar">
<attr name="rainbowbar_hspace" format="dimension"></attr>
<attr name="rainbowbar_vspace" format="dimension"></attr>
<attr name="rainbowbar_color" format="color"></attr>
</declare-styleable>

舉例說明:

藍色的進度條

public class RainbowBar extends View {

//progress bar color
int barColor = Color.parseColor("#1E88E5");
//every bar segment width
int hSpace = Utils.dpToPx(80, getResources());
//every bar segment height
int vSpace = Utils.dpToPx(4, getResources());
//space among bars
int space = Utils.dpToPx(10, getResources());
float startX = 0;
float delta = 10f;
Paint mPaint;

public RainbowBar(Context context) {
super(context);
}

public RainbowBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public RainbowBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//read custom attrs
TypedArray t = context.obtainStyledAttributes(attrs,
R.styleable.rainbowbar, 0, 0);
hSpace = t.getDimensionPixelSize(R.styleable.rainbowbar_rainbowbar_hspace, hSpace);
vSpace = t.getDimensionPixelOffset(R.styleable.rainbowbar_rainbowbar_vspace, vSpace);
barColor = t.getColor(R.styleable.rainbowbar_rainbowbar_color, barColor);
t.recycle(); // we should always recycle after used
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(barColor);
mPaint.setStrokeWidth(vSpace);
}

.......
}

View有了三個構造方法需要我們重寫,這里介紹下三個方法會被調用的場景,

第一個方法,一般我們這樣使用時會被調用,View view = new View(context);

第二個方法,當我們在xml布局文件中使用View時,會在inflate布局時被調用,
<View layout_width="match_parent" layout_height="match_parent"/>。

第三個方法,跟第二種類似,但是增加style屬性設置,這時inflater布局時會調用第三個構造方法。
<View style="@styles/MyCustomStyle" layout_width="match_parent" layout_height="match_parent"/>。

⑶ Android 自定義View之Draw過程(上)

Draw 過程系列文章

Android 展示之三部曲:

前邊我們已經分析了:

這倆最主要的任務是: 確定View/ViewGroup可繪制的矩形區域。
接下來將會分析,如何在這給定的區域內繪制想要的圖形。

通過本篇文章,你將了解到:

Android 提供了關於View最基礎的兩個類:

然而ViewGroup 並沒有約定其內部的子View是如何布局的,是疊加在一起呢?還是橫向擺放、縱向擺放等。同樣的View 也沒有約定其展示的內容是啥樣,是矩形、圓形、三角形、一張圖片、一段文字抑或是不規則的形狀?這些都要我們自己去實現嗎?
不盡然,值得高興的是Android已經考慮到上述需求了,為了開發方便已經預制了一些常用的ViewGroup、View。
如:
繼承自ViewGroup的子類

繼承自View的子類

雖然以上衍生的View/ViewGroup子類已經大大為我們提供了便利,但也僅僅是通用場景下的通用控制項,我們想實現一些較為復雜的效果,比如波浪形狀進度條、會發光的球體等,這些系統控制項就無能為力了,也沒必要去預制千奇百怪的控制項。想要達到此效果,我們需要自定義View/ViewGroup。
通常來說自定義View/ViewGroup有以下幾種:

3 一般不怎麼用,除非布局比較特殊。1、2、4 是我們常用的手段,對於我們常說的"自定義View" 一般指的是 4。
接下來我們來看看 4是怎麼實現的。

在xml里引用MyView

效果如下:

黑色部分為其父布局背景。
紅色矩形+黃色圓形即是MyView繪制的內容。
以上是最簡單的自定義View的實現,我們提取重點歸納如下:

由上述Demo可知,我們只需要在重寫的onDraw(xx)方法里繪制想要的圖形即可。
來看看View 默認的onDraw(xx)方法:

發現是個空實現,因此繼承自View的類必須重寫onDraw(xx)方法才能實現繪制。該方法傳入參數為:Canvas類型。
Canvas翻譯過來一般叫做畫布,在重寫的onDraw(xx)里拿到Canvas對象後,有了畫布我們還需要一支筆,這只筆即為Paint,翻譯過來一般稱作畫筆。兩者結合,就可以愉快的作畫(繪制)了。
你可能發現了,在Demo里調用

並沒有傳入Paint啊,是不是Paint不是必須的?實際上調用該方法後,底層會自動生成Paint對象。

可以看到,底層初始化了Paint,並且給其設置的顏色為在java層設置的顏色。

onDraw(xx)比較簡單,開局一個Canvas,效果全靠畫。
試想,這個Canvas怎麼來的呢,換句話說是誰調用了onDraw(xx)。發揮一下聯想功能,在Measure、Layout 過程有提到過兩者套路很像:

那麼Draw過程是否也是如此套路呢?看見了onDraw(xx),那麼draw(xx)還遠嗎?
沒錯,還真有draw(xx)方法:

可以看出,draw(xx)主要分為兩個部分:

不管是A分支還是B分支,都進行了好幾步的繪制。
通常來說,單一一個View的層次分為:

後面繪制的可能會遮擋前邊繪制的。
對於一個ViewGroup來說,層次分為:

來看看A分支標注的4個點:
(1)
onDraw(canvas)
前面分析過,對於單一的View,onDraw(xx)是空實現,需要由我們自定義繪制。
而對於ViewGroup,也並沒有具體實現,如果在自定義ViewGroup里重寫onDraw(xx),它會執行嗎?默認是不會執行的,相關分析請移步:
Android ViewGroup onDraw為什麼沒調用

(2)
dispatchDraw(canvas),來看看在View.java里的實現:

發現是個空實現,再看看ViewGroup.java里的實現:

也即是說,對於單一View,因為沒有子布局,因此沒必要再分發Draw,而對於ViewGroup來說,需要觸發其子布局發起Draw過程(此過程後續分析),可以類比事件分發過程View、ViewGroup的處理。感興趣的請移步:
Android 輸入事件一擼到底之View接盤俠(3)

(3)
OverLay,顧名思義就是"蓋在某個東西上面",此處是在繪制內容之後,繪制前景之前。怎麼用呢?

以上是給一個ViewGroup設置overLay,效果如下:

你可能發現了,這和設置overLay差不多的嘛,實際還是有差別的。在onDrawForeground(xx)里會重新調整Drawable的尺寸,該尺寸與View大小一致,之前給Drawable設置的尺寸會失效。運行效果如下:

可以看出,ViewGroup都被前景蓋住了。
再來看看B分支的重點:邊緣漸變效果
先來看看TextView 邊緣漸變效果:

加上這倆參數。
實際上系統自帶的一些控制項也使用了該效果,如NumberPicker、YearPickerView

以上是NumberPicker 的效果,可以看出是垂直方向漸變的。

對於View.java 里的onDraw(xx)、draw(xx),ViewGroup.java里並沒有重寫。
而對於dispatchDraw(xx),在View.java里是空實現。在ViewGroup.java里發起對子布局的繪制。

來看看標記的2點:
(1)
設置padding的目的是為了讓子布局留出一定的空隙出來,因此當設置了padding後,子布局的canvas需要根據padding進行裁減。判斷標記為:

FLAG_CLIP_TO_PADDING 默認設置為true
FLAG_PADDING_NOT_NULL 只要有padding不為0,該標記就會打上。
也就是說:只要設置了padding 不為0,子布局顯示區域需要裁減。
能不能不讓子布局裁減顯示區域呢?
答案是可以的。
考慮到一種場景:使用RecyclerView的時候,我們需要設置paddingTop = 20px,效果是:RecyclerView Item展示時離頂部有20px,但是滾動的時候永遠滾不到頂部,看起來不是那麼友好。這就是上述的裁減起作用了,需要將此動作禁止。通過設置:

當然也可以在xml里設置:

(2)
drawChild(xx)

從方法名上看是調用子布局進行繪制。
child.draw(x1,x2,x3)里分兩種情況:

這兩者具體作用與區別會在下篇文章分析,不管是硬體加速繪制還是軟體加速繪制,最終都會調用View.draw(xx)方法,該方法上面已經分析過。
注意,draw(x1,x2,x3)與draw(xx)並不一樣,不要搞混了。

用圖表示:

View/ViewGroup Draw過程的聯系:

一般來說,我們通常會自定義View,並且重寫其onDraw(xx)方法,有沒有繪制內容的ViewGroup需求呢?
是有的,舉個例子,大家可以去看看RecyclerView ItemDecoration 的繪制,其中運用到了ViewGroup draw(xx)、ViewGroup onDraw(xx) 、View onDraw(xx)繪制的先後順序來實現分割線,分組頭部懸停等功能的。

本篇文章基於 Android 10.0

⑷ 【Android自定義View】仿Photoshop取色器ColorPicker(一)

一款仿Photoshop取色器的Android版取色器。採用HSV顏色空間,可手動選取想要的顏色,也可以手動輸入具體顏色的16進制編碼以獲取顏色(如:0xFFFFFF表示白色)。

github地址: https://github.com/relish-wang/ColorPicker

ColorPicker效果圖

ColorPicker 項目結構如下圖所示:

核心自定義控制項: ColorPickerView.java

顏色拾取對話框: ColorPickerDialog.java

顏色轉換相關工具: Utils.java

對話框布局文件: dialog_color_picker.xml(縱向布局) + dialog_color_picker.xml(橫向布局)

其他文件內容都為項目構建時的默認內容。

在開始了解 ColorPicker 的具體實現之前,需要首先了解一些顏色相關的概念。

而 ColorPicker庫 的 核心自定義控制項ColorPickerView 的顏色拾取功能就是基於 HSV顏色空間 的。而且HSV和RGB是可以進行轉換。不過不必擔心轉換,因為android.graphics.Color.java提供了轉換方法:

下一篇主要講解ColorPickerView的繪制流程: 仿Photoshop取色器ColorPicker(二)

⑸ 如何在android studio中實現自定義view

一、首先新建一個項目,項目及名稱自擬。
二、在app上點擊右鍵->new->Mole 選擇Android library。
三、在topbar下的values中新建一個attrs.xml文件,用來存放自定義view的屬性。
4.在topbar下實現view。
5.上面兩部做完後就是引用這個view,這里需要注意的是要在主app的build.gradle中添加引用如下:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':topbar')
}
topbar就是要使用的moudle,切記添加引用。然後就可以使用了。
6.要想使用自定義view中的屬性的話任然需要添加xmlns:custom="schemas.android.com/apk/res-auto",前面加上http。
在這里還要注意命名空間也就是xustom之前一定不能定義過,否則重復的話就無法使用。

⑹ Android開發 自定義View

Android自定義View實現很簡單:
1、繼承View,重寫構造函數、onDraw,(onMeasure)等函數。
2、如果自定義的View需要有自定義的屬性,需要在values下建立attrs.xml。在其中定義你的屬性。
3、在使用到自定義View的xml布局文件中需要加入xmlns:前綴="http://schemas.android.com/apk/res/你的自定義View所在的包路徑".
4、在使用自定義屬性的時候,使用前綴:屬性名,如my:textColor="#FFFFFFF"。
實例:
自定義TextView類:
復制代碼
package com.zst.service.component;
import com.example.hello_wangle.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MyTextView extends TextView {
//不能在布局文件中使用
public MyTextView(Context context) {
super(context);
}

//布局文件中用到此構造函數

熱點內容
java等待 發布:2025-02-07 07:28:24 瀏覽:611
vs編譯器會自己加空格嗎 發布:2025-02-07 07:23:05 瀏覽:174
光遇切換賬號安卓要輸入些什麼 發布:2025-02-07 07:10:20 瀏覽:501
多角線演算法 發布:2025-02-07 07:08:56 瀏覽:273
有效提高ftp傳輸速度 發布:2025-02-07 07:06:47 瀏覽:703
寒靈之劍腳本 發布:2025-02-07 06:57:12 瀏覽:119
解壓的窗口 發布:2025-02-07 06:44:34 瀏覽:798
android身份證 發布:2025-02-07 06:36:43 瀏覽:431
python的庫在哪 發布:2025-02-07 06:30:24 瀏覽:349
帶鎖的鉛筆如何改密碼 發布:2025-02-07 06:18:05 瀏覽:165