android自定義視圖
A. android的自定義View的實現原理哪位能給我個思路呢。謝謝。
如果說要按類型來劃分的話,自定義View的實現方式大概可以分為三種,自繪控制項、組合控制項、以及繼承控制項。那麼下面我們就來依次學習一下,每種方式分別是如何自定義View的。
一、自繪控制項
自繪控制項的意思就是,這個View上所展現的內容全部都是我們自己繪制出來的。繪制的代碼是寫在onDraw()方法中的,而這部分內容我們已經在Android視圖繪制流程完全解析,帶你一步步深入了解View(二)中學習過了。
下面我們准備來自定義一個計數器View,這個View可以響應用戶的點擊事件,並自動記錄一共點擊了多少次。新建一個CounterView繼承自View,代碼如下所示:
<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#ffcb05">
<Button
android:id="@+id/button_left"
android:layout_width="60dp"
android:layout_height="40dp"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:background="@drawable/back_button"
android:text="Back"
android:textColor="#fff"/>
<TextView
android:id="@+id/title_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="ThisisTitle"
android:textColor="#fff"
android:textSize="20sp"/>
</RelativeLayout>
在這個布局文件中,我們首先定義了一個RelativeLayout作為背景布局,然後在這個布局裡定義了一個Button和一個TextView,Button就是標題欄中的返回按鈕,TextView就是標題欄中的顯示的文字。
接下來創建一個TitleView繼承自FrameLayout,代碼如下所示:
{
privateButtonleftButton;
privateTextViewtitleText;
publicTitleView(Contextcontext,AttributeSetattrs){
super(context,attrs);
LayoutInflater.from(context).inflate(R.layout.title,this);
titleText=(TextView)findViewById(R.id.title_text);
leftButton=(Button)findViewById(R.id.button_left);
leftButton.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
((Activity)getContext()).finish();
}
});
}
publicvoidsetTitleText(Stringtext){
titleText.setText(text);
}
publicvoidsetLeftButtonText(Stringtext){
leftButton.setText(text);
}
(OnClickListenerl){
leftButton.setOnClickListener(l);
}
}
TitleView中的代碼非常簡單,在TitleView的構建方法中,我們調用了LayoutInflater的inflate()方法來載入剛剛定義的title.xml布局,這部分內容我們已經在Android LayoutInflater原理分析,帶你一步步深入了解View(一)這篇文章中學習過了。
接下來調用findViewById()方法獲取到了返回按鈕的實例,然後在它的onClick事件中調用finish()方法來關閉當前的Activity,也就相當於實現返回功能了。
另外,為了讓TitleView有更強地擴展性,我們還提供了setTitleText()、setLeftButtonText()、setLeftButtonListener()等方法,分別用於設置標題欄上的文字、返回按鈕上的文字、以及返回按鈕的點擊事件。
到了這里,一個自定義的標題欄就完成了,那麼下面又到了如何引用這個自定義View的部分,其實方法基本都是相同的,在布局文件中添加如下代碼:
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.customview.TitleView
android:id="@+id/title_view"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.example.customview.TitleView>
</RelativeLayout>
這樣就成功將一個標題欄控制項引入到布局文件中了,運行一下程序。
現在點擊一下Back按鈕,就可以關閉當前的Activity了。如果你想要修改標題欄上顯示的內容,或者返回按鈕的默認事件,只需要在Activity中通過findViewById()方法得到TitleView的實例,然後調用setTitleText()、setLeftButtonText()、setLeftButtonListener()等方法進行設置就OK了。
B. android自定義view要怎麼使用
視圖,凡事能被用戶看到的小控制項都是一種view,也可以自定義view
C. Android問題:自定義視圖的時候,onMeasure()這個方法有什麼用
描述View本身大小的多少!
自定義View的時候重載onMeasure(),onLayout(),onDraw()三個函數構建了自定義View的外觀形象。再加上onTouchEvent()等重載視圖的行為,可以構建任何我們需要的可感知到的自定義View。
我們知道,不管是自定義View還是系統提供的TextView這些,它們都必須放置在LinearLayout等一些ViewGroup中,因此理論上我們可以很好的理解onMeasure(),onLayout(),onDraw()這三個函數:1.View本身大小多少,這由onMeasure()決定;2.View在ViewGroup中的位置如何,這由onLayout()決定;3.繪制View,onDraw()定義了如何繪制這個View。
D. 如何使用Android自定義復合視圖
Android框架提供了很多的視圖和布局,但有些情況下開發者需要創建自己的視圖。有時候是擴展內置的類來增加功能,就像在文本框中支持自定義字體和字元間距。其他情況下,因為內置的視圖不能提供所需的功能,就像徑向刻度盤。
現在討論的是自定義復合視圖。視圖由多個其他的視圖組成,內置的或自定義的都可以,用來封裝復雜的交互和功能。
在一個成熟且完整的Fragment完全滿足我需求的情況下,我使用了復合視圖,因為我想要一個可重用、可測試的組件。上面的例子很好的說明了這種情況。由於代碼屬於一個客戶項目,所以我在這里創建了一個簡單的項目展示如何創建和使用自定義視圖。
E. android中的View是做什麼的
View類是Android的一個超類,這個類幾乎包含了所有的屏幕類型。每一個View都有一個用於繪圖的畫布,這個畫布可以進行任意擴展。在游戲開發中葉可以自定義視圖(View),這個畫布的功能更能滿足我們在游戲開發中的需要。在Android中,任何一個View類都只需重寫onDraw 方法來實現界面顯示,自定義的視圖可以是復雜的3D實現,也可以是非常簡單的文本形式等。
F. 如何將Android視圖和自定義視圖融合在一起
第二種中,中間的先只加外框,再通過line_panel獲取,再用第一種方式在程序中添加你的lineview呢?
G. android 自定義view 的高度,寬度怎麼設置
Android中View是顯示控制項,需要用一個layout布局來裝載,layout尺寸大寫的設置如下:
1. 盡量使用wrap_content、match_parent、weight 來規定layout的大小。
2. 要確保布局的靈活性並適應各種尺寸的屏幕,應使用 「wrap_content」 和 「match_parent」 控制某些視圖組件的寬度和高度。
3. 使用 「wrap_content」,系統就會將視圖的寬度或高度設置成所需的最小尺寸以適應視圖中的內容,而 「match_parent」(在低於 API 級別 8 的級別中稱為「fill_parent」)則會展開組件以匹配其父視圖的尺寸。
4. 如果使用 「wrap_content」 和 「match_parent」 尺寸值而不是硬編碼的尺寸,視圖就會相應地僅使用自身所需的空間或展開以填滿可用空間。此方法可讓布局正確適應各種屏幕尺寸和屏幕方向。
5. 如果某些地方必須要規定控制項的大小,那麼要使用dp 或者 dip單位。
H. 什麼是Android自定義視圖
Android框架提供了很多的視圖和布局,但有些情況下開發者需要創建自己的視圖。有時候是擴展內置的類來增加功能,就像在文本框中支持自定義字體和字元間距。其他情況下,因為內置的視圖不能提供所需的功能,就像徑向刻度盤。
現在討論的是自定義復合視圖。視圖由多個其他的視圖組成,內置的或自定義的都可以,用來封裝復雜的交互和功能。
I. android 自定義view怎麼做能提高效率
越少越好
為了加速視圖,從那些調用頻繁的活動中減少不必要的代碼。在OnDraw()方法中開始繪制,它會給你最大的
效益。特別低,你也應該減少在onDraw()方法中的內存分配,因為任何內存分配都可能導致內存回收,這將會
引起不連貫。 在初始化或者動畫之間分配對象。絕不要在動畫運行時分配內存。
另一方面需要減少onDraw()方法中的開銷,只在需要時才調用onDraw()方法。通常invalidate()方法會調用
onDraw()方法,因此減少對invalidate()的不必要調用。如果可能,調用它的重載版本即帶有參數的invalidate()
方法而不是無參的invalidate()方法。該帶參數的方法invalidate()能使draw過程更有效,以及減少對落在該矩形
區域(參數指定的區域)外視圖的不必要重繪 。
J. android 繼承viewGroup自定義了一個視圖,那個自定義的視圖在activity的oncrate方法裡面添加子。。
添加的子View,如果用hierarchyviewer工具可以看到,而你看不到,那麼可能原因有:
是你添加子View的時候裡面已經有View了,並被蓋住了。可以先調用removeAllViews()試下。
oncreate能看到,onresume不能看到,調用setContentView()方法試下,應該是沒有刷新當前界面