android自定义view

android怎么自定义view呢?不知道的小伙伴来看看小编今天的分享吧!

android可以通过组合控件来实现自定义view。组合控件就是将系统原有的控件进行组合,构成一个新的控件。这种方式下,不需要开发者自己去绘制图上显示的内容,也不需要开发者重写onMeasure,onLayout,onDraw方法来实现测量、布局以及draw流程。

具体操作:

1、定义标题栏布局文件

定义标题栏的布局文件custom_title_view.xml,将返回按钮和标题文本进行组合。这一步用于确定标题栏的样子,代码如下所示:

xmlversion="1.0"encoding="utf-8"?

RelativeLayoutxmlns:android="/apk/res/android"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="@android:color/holo_orange_light"

Button

android:id="@+id/btn_left"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerVertical="true"

android:layout_marginLeft="5dp"

android:text="Back"

android:textColor="@android:color/white"/

TextView

android:id="@+id/title_tv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:text="Title"

android:textColor="@android:color/white"

android:textSize="20sp"/

/RelativeLayout

2、根据给定布局实现自定义View

publicclassCustomTitleViewextendsFrameLayoutimplementsView.OnClickListener{

privateView.OnClickListenermLeftOnClickListener;

privateButtonmBackBtn;

privateTextViewmTittleView;

publicCustomTitleView(@NonNullContextcontext,@NullableAttributeSetattrs){

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

publicvoidonClick(Viewv){

switch(v.getId()){

caseR.id.btn_left:

if(mLeftOnClickListener!=null){

mLeftOnClickListener.onClick(v);

}

break;

}

}

publicvoidsetLeftOnClickListener(View.OnClickListenerleftOnClickListener){

mLeftOnClickListener=leftOnClickListener;

}

publicvoidsetTittle(Stringtitle){

mTittleView.setText(title);

}

}

说明:

(1)代码中对外提供了两个接口,一是动态设置标题,二是使用者可以自定义返回按钮的点击事件。

(2)CustomTitleView的构造函数,要选择两个参数的,选择其它参数的构造函数会报错。这一点是笔者开发机测试的结果,暂时不清楚是不是所有手机上都是这样。

(3)这里是继承的FrameLayout,但是继承LinearLayout,RelativeLayout等系统布局控件都可以。之所以要继承这些系统现成的ViewGroup,是因为这样可以不用再重写onMeasure,onLayout等,这样省事很多。由于这里是一个布局控件,要用LayoutInflater来填充,所以需要继承ViewGroup,如果继承View的直接子类,编译会不通过。所以,CustomTitleView自己就是一个容器,完全可以当成容器使用,此时CustomTitleView自身的内容会和其作为父布局添加的子控件,效果会叠加,具体的叠加效果是根据继承的容器特性决定的。

3、在Activity的布局文件中添加CustomTitleView。

在Activity的布局文件activity_custom_view_compose_demo.xml中,像使用系统控件一样使用CustomTitleView即可。CustomTitleView自己就是继承的现成的系统布局,所以它们拥有的属性特性,CustomTitleView一样拥有。

xmlversion="1.0"encoding="utf-8"?

RelativeLayoutxmlns:android="/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

com.example.demos.customviewdemo.CustomTitleView

android:id="@+id/customview_title"

android:layout_width="match_parent"

android:layout_height="wrap_content"

/com.example.demos.customviewdemo.CustomTitleView

/RelativeLayout

4、在Activity中操作CustomTitleView,代码如下:

1publicclassCustomViewComposeDemoActivityextendsAppCompatActivity{23privateCustomTitleViewmCustomTitleView;4@Override5protectedvoidonCreate(BundlesavedInstanceState){6super.onCreate(savedInstanceState);7setContentView(R.layout.activity_custom_view_compose_demo);8mCustomTitleView=findViewById(R.id.customview_title);9mCustomTitleView.setTittle("ThisisTitle");10mCustomTitleView.setLeftOnClickListener(newView.OnClickListener(){11@Override12publicvoidonClick(Viewv){13finish();14}15});1617}18}

在第8行中,获取到CustomTitleView实例,第9行设置标题文字,第10行自定义“Back”按钮点击事件。

5、效果图

按照如上的4步,就通过组合控件完成了一个比较简单的自定义标题栏。

以上就是小编今天的分享了,希望可以帮助到大家。