當前位置:首頁 » 安卓系統 » android自定義繪制

android自定義繪制

發布時間: 2022-08-05 21:01:37

1. 如何系統的學習android自定義各種酷炫控制項

首先,為什麼需要自定義View?

1. 現有的View滿足不了你的需求,也沒有辦法從已有控制項派生一個出來;界面元素需要自己繪制。
2. 現有View可以滿足要求,把它做成自定義View只是為了抽象:為這個自定義View提供若干方法,方便調用著操縱View。通常做法是派生一個已有View,或者結合xml文件直接inflate。

目前常用的基本上是第二種方式,這種方式非常簡單,與通常的View使用方法基本相同,但是作用卻異常強大,擁有了這一層抽象,代碼更加整潔也更容易維護,通過抽取自定義View的公共操作方法也減少了冗餘代碼,雖然簡單,但不可忽視。

大多數人感覺神秘的應該是第一種,自繪控制項,完全自定義;但其實這兩種方式歸根結底全部都是自繪;不信你去看看TextView的源碼。只不過通常情況下系統幫我們繪制好了一些控制項給開發者使用;OK,接下來就是一個問題。

在講述之前我還是啰嗦地重申一下,復用已有View是最最常用也最有效的自定義View方式,必須熟練使用。

其次,如何自定義View?

想一下,一個View給用戶最直觀的感知是什麼?靜止的形態和動態的操作。靜止的形態意思就是一個View呈現到用戶眼裡長成啥樣子?動態操作指的是,用戶與View之間可以有哪些交互?點擊滑動View的不同地方會有什麼反應?

1. 靜態

如果一個自定義View的樣式都沒有辦法繪制出來,那麼後續的交互就是空談了;我們一步步分解這個問題。

1.1 你的自定義View分為哪幾個部分?是所有的部分都需要手動繪制還是只有一部分——找出需要完全自定義的部分,其他的部分用已有View實現。

1.2 你的自定義View的每個部分長成什麼樣,佔用多大空間——結合理論知識View的measure過程,比如match_parent, wrap_content結合父View的laout_params參數最終測量大小是多少?

1.3 你的自定義View每個部分擺放在哪?相對位置如何?——View的layout過程。

1.4 你的自定義View那些完全需要手動繪制的部分是什麼樣,如何繪制?

你得學會操縱Canvas,學會2D繪圖,什麼?你跟我說3D,OpenGL?學會這些再說。

2. Android 自定義控制項:怎麼在一個控制項繪制之前改變它的某些屬性再繪制

控制項尺寸的變化可以通過重寫onSizeChanged實現,這個方法帶有寬高的參數,你設置一個高和寬的全局變數,在這個方法里把高寬重新設置。代碼就像下面這樣:

java">
@Override
protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){
super.onSizeChanged(w,h,oldw,oldh);
this.width=w;
this.height=h;
invalidate();
}

最後調用invalidate可以讓控制項重新調用onDraw方法

3. Android自定義view時繪制字元串和圖片的自適應屏幕問題

在onDraw裡面要獲取控制項的寬高

int height = getHeight();

int width = getWidth();

我隨便拷了段開源項目的代碼給你看看:

intheight=getHeight();
intwidth=getWidth();
intsingleHeight=height/b.length;
for(inti=0;i<b.length;i++){
paint.setColor(Color.BLACK);
//paint.setColor(Color.WHITE);
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setAntiAlias(true);
paint.setTextSize(20);
if(i==choose){
paint.setColor(Color.parseColor("#f15353"));
paint.setFakeBoldText(true);
}
floatxPos=width/2-paint.measureText(b[i])/2;
floatyPos=singleHeight*i+singleHeight;
canvas.drawText(b[i],xPos,yPos,paint);
paint.reset();
}

4. 請教大神,android中我需要在自定義控制項中繪制一個透明的小三角行

代碼:
public class MyView extends View {
//坐標軸原點的位置
private int xPoint=60;
private int yPoint=260;
//刻度長度
private int xScale=8; //8個單位構成一個刻度
private int yScale=40;
//x與y坐標軸的長度
private int xLength=380;
private int yLength=240;

private int MaxDataSize=xLength/xScale; //橫坐標 最多可繪制的點

private List<Integer> data=new ArrayList<Integer>(); //存放 縱坐標 所描繪的點

private String[] yLabel=new String[yLength/yScale]; //Y軸的刻度上顯示字的集合

private Handler mh=new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what==0){ //判斷接受消息類型
MyView.this.invalidate(); //刷新View
}
};
};
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
for (int i = 0; i <yLabel.length; i++) {
yLabel[i]=(i+1)+"M/s";
}
new Thread(new Runnable() {
@Override
public void run() {
while(true){ //在線程中不斷往集合中增加數據
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(data.size()>MaxDataSize){ //判斷集合的長度是否大於最大繪制長度
data.remove(0); //刪除頭數據
}
data.add(new Random().nextInt(5)+1); //生成1-6的隨機數
mh.sendEmptyMessage(0); //發送空消息通知刷新
}
}
}).start();
}

5. Android開發怎麼自定義繪制如下圖中這種進度條急需!在線等!

一)變換前背景

先來看看progressbar的屬性:
1. <ProgressBar
2. android:id="@+id/progressBar"
3. style="?android:attr/progressBarStyleHorizontal"
4. android:layout_width="match_parent"
5. android:layout_height="wrap_content"
6. android:layout_margin="5dip"
7. android:layout_toRightOf="@+id/progressBarV"
8. android:indeterminate="false"
9. android:padding="2dip"
10. android:progress="50" />
根據style="?android:attr/progressBarStyleHorizontal",我們找到源碼中的style.xml
1. <style name="Widget.ProgressBar.Horizontal">
2. <item name="android:indeterminateOnly">false</item>
3. <item name="android:progressDrawable">@android:drawable/progress_horizontal</item>
4. <item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
5. <item name="android:minHeight">20dip</item>
6. <item name="android:maxHeight">20dip</item>
7. </style>
看到
<item name="android:progressDrawable">@android:drawable/progress_horizontal</item>
木有,繼續發掘源碼,找到drawable下面的progress_horizontal.xml,這就是我們今天的主角了:
1. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
2.
3. <item android:id="@android:id/background">
4. <shape>
5. <corners android:radius="5dip" />
6. <gradient
7. android:startColor="#ff9d9e9d"
8. android:centerColor="#ff5a5d5a"
9. android:centerY="0.75"
10. android:endColor="#ff747674"
11. android:angle="270"
12. />
13. </shape>
14. </item>
15.
16. <item android:id="@android:id/secondaryProgress">
17. <clip>
18. <shape>
19. <corners android:radius="5dip" />
20. <gradient
21. android:startColor="#80ffd300"
22. android:centerColor="#80ffb600"
23. android:centerY="0.75"
24. android:endColor="#a0ffcb00"
25. android:angle="270"
26. />
27. </shape>
28. </clip>
29. </item>
30.
31. <item android:id="@android:id/progress">
32. <clip>
33. <shape>
34. <corners android:radius="5dip" />
35. <gradient
36. android:startColor="#ffffd300"
37. android:centerColor="#ffffb600"
38. android:centerY="0.75"
39. android:endColor="#ffffcb00"
40. android:angle="270"
41. />
42. </shape>
43. </clip>
44. </item>
45.
46. </layer-list>
看到android:id="@android:id/progress"木有,看到android:id="@android:id/secondaryProgress"木有
把這個文件復制到自己工程下的drawable,就可以隨心所欲的修改shape的屬性,漸變,圓角等等
那麼怎麼放一個圖片進去呢,ok,新建progress_horizontal1.xml:
1. <?xml version="1.0" encoding="utf-8"?>
2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
3.
4. <item android:id="@android:id/progress" android:drawable="@drawable/progressbar" />
5.
6. </layer-list>
在android:drawable中指定你處理好的圖片
然後回到布局中
1. <ProgressBar
2. android:id="@+id/progressBar1"
3. android:layout_width="match_parent"
4. android:layout_height="wrap_content"
5. android:layout_below="@+id/progressBar"
6. android:layout_margin="5dip"
7. android:layout_toRightOf="@+id/progressBarV"
8. android:background="@drawable/progress_bg"
9. android:indeterminate="false"
10. android:indeterminateOnly="false"
11. android:maxHeight="20dip"
12. android:minHeight="20dip"
13. android:padding="2dip"
14. android:progress="50"
15. android:progressDrawable="@drawable/progress_horizontal1" />
android:background="@drawable/progress_bg"指定背景
android:progressDrawable="@drawable/progress_horizontal1"前景使用上面的progress_horizontal1

要是還不行

你來我們群里說吧

這里是開發者互相學習交流的 有大神

讓他們給你解釋你的疑問 號 碼look at my n a m e.....

6. android怎麼動態調用View.ondraw實現動態繪制自定義View

在自定義的時候,復寫該方法,在代碼中繪制控制項時,會自動調用該方法,在修改了控制項,需要重新繪制時,則使用View的invalidate()即可實現重繪!!!

7. android:如何用canvas在自定義view里畫圖

做安卓開發的話,不會自定義view是不行的,自定定義各種控制項以滿足開發需求,在開發中是很重要的,自定義view通過繼承view,通過重寫ondraw方法實現重繪自己所需要的控制項樣式。
在ondraw方法中,通過canvas來繪制想要的樣式,首先需要定義好畫筆,以及畫筆的各種屬性,比如需要的時候要
抗鋸齒
等等。都准備好了就可以用canvas來實現繪圖了,當然api提供的api肯定是不夠用的,需要多姿多彩的樣式很多時候需要藉助准備好的一些圖片,通過canvas繪制bitmap來實現把准備好的圖片繪制上去。繪制好了當然還是不夠的,控制項都是需要和用戶交互的,所以很多時候樣式是會發生改變的,所以要在其中定義相關方法暴露出來,方法中處理用戶操作或其他的結果改變樣式的重繪,繪制好了調用更新(
invalidate
())方法,實現樣式的改變。做好一個控制項還需要優化性能等等,都需要一步一慢慢實現。

熱點內容
javasocket讀取 發布:2025-01-19 16:59:48 瀏覽:336
魅族路由器在哪裡設置密碼 發布:2025-01-19 16:59:45 瀏覽:657
經濟與發展資料庫 發布:2025-01-19 16:59:44 瀏覽:727
出國訪問奪權 發布:2025-01-19 16:57:22 瀏覽:591
vb打開共享文件夾 發布:2025-01-19 16:57:11 瀏覽:484
怎麼查詢手機wifi密碼 發布:2025-01-19 16:41:31 瀏覽:187
linux編輯圖片 發布:2025-01-19 16:37:55 瀏覽:167
sql數據對比 發布:2025-01-19 16:32:09 瀏覽:232
magnet下載ftp 發布:2025-01-19 16:27:07 瀏覽:318
注冊密碼下劃線是什麼意思 發布:2025-01-19 16:23:58 瀏覽:806