...">
瀏覽量:129次
android怎么自定義view呢?不知道的小伙伴來看看陽泰小編今天的分享吧!
android可以通過組合控件來實(shí)現(xiàn)自定義view。組合控件就是將系統(tǒng)原有的控件進(jìn)行組合,構(gòu)成一個新的控件。這種方式下,不需要開發(fā)者自己去繪制圖上顯示的內(nèi)容,也不需要開發(fā)者重寫onMeasure,onLayout,onDraw方法來實(shí)現(xiàn)測量、布局以及draw流程。
具體操作:
1、定義標(biāo)題欄布局文件
?定義標(biāo)題欄的布局文件custom_title_view.xml,將返回按鈕和標(biāo)題文本進(jìn)行組合。這一步用于確定標(biāo)題欄的樣子,代碼如下所示:
android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/holo_orange_light">
2、根據(jù)給定布局實(shí)現(xiàn)自定義View
public class CustomTitleView extends FrameLayout implements View.OnClickListener {
private View.OnClickListener mLeftOnClickListener;
private Button mBackBtn;
private TextView mTittleView;
public CustomTitleView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.custom_title_view, this);
mBackBtn = findViewById(R.id.btn_left);
mBackBtn.setOnClickListener(this);
mTittleView = findViewById(R.id.title_tv);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_left:
if (mLeftOnClickListener != null) {
mLeftOnClickListener.onClick(v);
?}
break;
}
}
public void setLeftOnClickListener(View.OnClickListener leftOnClickListener) {
mLeftOnClickListener = leftOnClickListener;
}
public void setTittle(String title){
mTittleView.setText(title);
}
}
說明:
(1)代碼中對外提供了兩個接口,一是動態(tài)設(shè)置標(biāo)題,二是使用者可以自定義返回按鈕的點(diǎn)擊事件。
(2)CustomTitleView的構(gòu)造函數(shù),要選擇兩個參數(shù)的,選擇其它參數(shù)的構(gòu)造函數(shù)會報(bào)錯。這一點(diǎn)是筆者開發(fā)機(jī)測試的結(jié)果,暫時不清楚是不是所有手機(jī)上都是這樣。
(3)這里是繼承的FrameLayout,但是繼承LinearLayout,RelativeLayout等系統(tǒng)布局控件都可以。之所以要繼承這些系統(tǒng)現(xiàn)成的ViewGroup,是因?yàn)檫@樣可以不用再重寫onMeasure,onLayout等,這樣省事很多。由于這里是一個布局控件,要用LayoutInflater來填充,所以需要繼承ViewGroup,如果繼承View的直接子類,編譯會不通過。所以,CustomTitleView自己就是一個容器,完全可以當(dāng)成容器使用,此時CustomTitleView自身的內(nèi)容會和其作為父布局添加的子控件,效果會疊加,具體的疊加效果是根據(jù)繼承的容器特性決定的。
3、在Activity的布局文件中添加CustomTitleView。
在Activity的布局文件activity_custom_view_compose_demo.xml中,像使用系統(tǒng)控件一樣使用CustomTitleView即可。CustomTitleView自己就是繼承的現(xiàn)成的系統(tǒng)布局,所以它們擁有的屬性特性,CustomTitleView一樣擁有。
android:layout_width="match_parent" android:layout_height="match_parent"> android:id="@+id/customview_title" android:layout_width="match_parent" android:layout_height="wrap_content">
?4、在Activity中操作CustomTitleView,代碼如下:
?1 public class CustomViewComposeDemoActivity extends AppCompatActivity { 2? 3? ? ?private CustomTitleView mCustomTitleView; 4? ? ?@Override 5? ? ?protected void onCreate(Bundle savedInstanceState) { 6? ? ? ? ?super.onCreate(savedInstanceState); 7? ? ? ? ?setContentView(R.layout.activity_custom_view_compose_demo); 8? ? ? ? ?mCustomTitleView = findViewById(R.id.customview_title); 9? ? ? ? ?mCustomTitleView.setTittle("This is Title");10? ? ? ? ?mCustomTitleView.setLeftOnClickListener(new View.OnClickListener() {11? ? ? ? ? ? ?@Override12? ? ? ? ? ? ?public void onClick(View v) {13? ? ? ? ? ? ? ? ?finish();14? ? ? ? ? ? ?}15? ? ? ? ?});16 17? ? ?}18 }
在第8行中,獲取到CustomTitleView實(shí)例,第9行設(shè)置標(biāo)題文字,第10行自定義“Back”按鈕點(diǎn)擊事件。
5、效果圖
按照如上的4步,就通過組合控件完成了一個比較簡單的自定義標(biāo)題欄。
[聲明]本網(wǎng)轉(zhuǎn)載網(wǎng)絡(luò)媒體稿件是為了傳播更多的信息,此類稿件不代表本網(wǎng)觀點(diǎn),本網(wǎng)不承擔(dān)此類稿件侵權(quán)行為的連帶責(zé)任。故此,如果您發(fā)現(xiàn)本網(wǎng)站的內(nèi)容侵犯了您的版權(quán),請您的相關(guān)內(nèi)容發(fā)至此郵箱【779898168@qq.com】,我們在確認(rèn)后,會立即刪除,保證您的版權(quán)。
官網(wǎng)優(yōu)化
整站優(yōu)化
渠道代理
400-655-5776