Android开发自定义UI组件

Android开发自定义UI组件

一些复用的UI组件,可以通过设置模板复用,接口回调等方法提高开发效率,降低代码耦合度。


自定义组件大概分为3步:

  1、自定义标签属性

  2、定义组件类

  3、在XML界面布局使用自定义标签

下面举例实现一个TopBar和一个GridItem的自定义组件。

这是项目目录结构


一、自定义标签属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    //TopBar标签属性定义
    <declare-styleable name="TopBar">
        <attr name="titleTopBar"    format="string"></attr>
        <attr name="titleTextSize"  format="dimension"></attr>
        <attr name="titleTextColor" format="color"></attr>
        <attr name="leftTextColor"  format="color"></attr>
        <attr name="leftBackground" format="reference|color"></attr>
        <attr name="leftText"       format="string"></attr>
        <attr name="rightTextColor" format="color"></attr>
        <attr name="rightBackground" format=" reference|color"></attr>
        <attr name="rightText"      format="string"></attr>
    </declare-styleable>
    //GridItem标签属性定义
    <declare-styleable name="GridItem">
        <attr name="titlegrid" format="string"></attr>
        <attr name="content"   format="string"></attr>
        <attr name="image"     format="reference"></attr>
    </declare-styleable>

</resources>

format 参数值:
1. reference:参考某一资源ID
2. color:颜色值
3. boolean:布尔值
4. dimension:尺寸值
5. float:浮点值
6. integer:整型值
7. string:字符串
8. fraction:百分数
9. enum:枚举值
//enum举例  属性定义:  
< declare -styleable name = "UI名称" >  
    <attr name = "orientation" >  
        <enum name = "horizontal" value = "0" />  
        <enum name = "vertical" value = "1" />  
    </attr>                        
</ declare -styleable>  
10. flag:位或运算
  

二、定义组件类

    TopBar组件类

public class TopBar extends RelativeLayout {

	//左边Button,中间标题,右边Button
	private Button leftBtn, rightBtn;
	private TextView tvTitle;

	private int leftTextColor;//左边Button字体颜色
	private Drawable leftBackground;//左边Button背景色
	private String leftText;//左边button文本

	private int rightTextColor;
	private Drawable rightBackground;
	private String rightText;

	private float titleTextSize;//标题字体大小
	private int titleTextColor;//标题字体颜色
	private String title;//标题内容
	private LayoutParams leftParams, rightParams, titleParams;
	private topBarClickListener listener;

	/**
	 * 接口回调,实现按钮监听模板
	 */
	public interface topBarClickListener {
		public void leftClick();//点击左边按钮监听

		public void rightClick();//点击右边按钮监听
	}

	public void setOnTopBarClickListener(topBarClickListener listener) {
		this.listener = listener;
	}

	public TopBar(Context context, AttributeSet attrs) {
		super(context, attrs);
		//用TypedArray获得TopBar属性回传的值
		TypedArray ta = context.obtainStyledAttributes(attrs,
				R.styleable.TopBar);
        //左边按钮属性值
		leftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, 0);
		leftBackground = ta.getDrawable(R.styleable.TopBar_leftBackground);
		leftText = ta.getString(R.styleable.TopBar_leftText);
        //右边按钮属性值
		rightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, 0);
		rightBackground = ta.getDrawable(R.styleable.TopBar_rightBackground);
		rightText = ta.getString(R.styleable.TopBar_rightText);
        //中间标题属性值
		title = ta.getString(R.styleable.TopBar_titleTopBar);
		titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor, 0);
		titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize, 0);
		// 回收,避免浪费资源
		ta.recycle();
        //此处是创建控件对象,通过LayoutParams设置控件属性,也可使用XML界面布局代码创建
		leftBtn = new Button(context);
		rightBtn = new Button(context);
		tvTitle = new TextView(context);

		leftBtn.setTextColor(leftTextColor);
		leftBtn.setBackground(leftBackground);
		leftBtn.setText(leftText);

		rightBtn.setTextColor(rightTextColor);
		rightBtn.setBackground(rightBackground);
		rightBtn.setText(rightText);

		tvTitle.setText(title);
		tvTitle.setTextColor(titleTextColor);
		tvTitle.setTextSize(titleTextSize);
		tvTitle.setGravity(Gravity.CENTER);

		setBackgroundColor(0x66E93EFF);

		leftParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT);
		leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
		addView(leftBtn, leftParams);

		rightParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT);
		rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
		addView(rightBtn, rightParams);

		titleParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
				LayoutParams.MATCH_PARENT);
		titleParams.addRule(RelativeLayout.CENTER_IN_PARENT);
		addView(tvTitle, titleParams);

		leftBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				listener.leftClick();
			}
		});
		rightBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				listener.rightClick();
			}
		});
	}

	/**
	 * 定义左边Button是否可见
	 */
	public void setLeftButtonVisiable(boolean flag) {
		if (flag) {
			leftBtn.setVisibility(View.VISIBLE);
		} else {
			leftBtn.setVisibility(View.GONE);
		}
	}

	/**
	 * 定义右边Button是否可见
	 */
	public void setRightButtonVisiable(boolean flag) {
		if (flag) {
			rightBtn.setVisibility(View.VISIBLE);
		} else {
			rightBtn.setVisibility(View.GONE);
		}
	}

	/**
	 * 设置左边Button背景
	 */
	public void setLeftBackground(int resid) {
		leftBtn.setBackgroundResource(resid);
	}

	/**
	 * 设置右边Button背景
	 */
	public void setRightBackground(int resid) {
		rightBtn.setBackgroundResource(resid);
	}

}


GridItem组件类

public class GridItem extends LinearLayout {

	private TextView tvGridTitle, tvGridContent;
	private ImageView ivGridIcon;

	private View gridView;

	private String title;
	private String content;
	private Drawable imageResId;

	public GridItem(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		TypedArray ta = context.obtainStyledAttributes(attrs,
				R.styleable.GridItem);

		gridView = LayoutInflater.from(context).inflate(R.layout.grid_item,
				this, true);

		tvGridTitle = (TextView) gridView.findViewById(R.id.tvGridTitle);
		tvGridContent = (TextView) gridView.findViewById(R.id.tvGridContent);
		ivGridIcon = (ImageView) gridView.findViewById(R.id.ivGridIcon);

		// 获取自定义属性值
		title = ta.getString(R.styleable.GridItem_titlegrid);
		content = ta.getString(R.styleable.GridItem_content);
		imageResId = ta.getDrawable(R.styleable.GridItem_image);

		// 回收一下,避免资源浪费
		ta.recycle();

		tvGridTitle.setText(title);
		tvGridContent.setText(content);
		ivGridIcon.setImageDrawable(imageResId);
	}
}
GridItem布局文件grid_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="3dp"
    android:paddingLeft="6dp" >

    <TextView
        android:id="@+id/tvGridTitle"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:textSize="10sp" />

    <TextView
        android:id="@+id/tvGridContent"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:textSize="10sp" />

    <ImageView
        android:id="@+id/ivGridIcon"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_gravity="right"
        android:layout_weight="2"
        android:scaleType="fitCenter"
        android:scaleX="0.8"
        android:scaleY="0.8" />

</LinearLayout>
自定义组件的布局,一般是由简单的组件组合而成,组合成新的自定义组件,可以创建一个单独的布局文件进行定义。


三、在XML界面布局使用自定义标签

activity_main.xml布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    <span style="color:#ff0000;">xmlns:app="http://schemas.android.com/apk/res/com.example.topbar"</span>
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.example.topbar.view.TopBar
        android:id="@+id/topbar"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        app:leftTextColor="#fff"
        app:rightText="设置"
        app:rightTextColor="#fff"
        app:titleTextColor="#fff"
        app:titleTextSize="13sp"
        app:titleTopBar="自定义标题" >
    </com.example.topbar.view.TopBar>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/topbar"
        android:layout_margin="10dp"
        android:orientation="horizontal" >

        <com.example.topbar.view.GridItem
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="#66FF0000"
            app:content="安卓开发"
            app:image="@drawable/grid_icon1"
            app:titlegrid="Android" />

        <com.example.topbar.view.GridItem
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginLeft="10dp"
            android:background="#660000FF"
            app:content="编程语言"
            app:image="@drawable/grid_icon2"
            app:titlegrid="C++" />

        <com.example.topbar.view.GridItem
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="#66AA7700"
            app:content="服务器"
            android:layout_marginLeft="10dp"
            app:image="@drawable/grid_icon3"
            app:titlegrid="Linux" />


        <com.example.topbar.view.GridItem
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginLeft="10dp"
            android:background="#66228B22"
            app:content="苹果开发"
            app:image="@drawable/grid_icon4"
            app:titlegrid="Ios" />
    </LinearLayout>

</RelativeLayout>
<h4><span style="color:#ff0000;">首先重点是声明组件的命名空间,作用相当于类中引用包名。</span></h4>

xmlns:app="http://schemas.android.com/apk/res/<span style="color:#ff0000;">com.example.topbar</span>

与系统的命名空间比较:

系统:xmlns:android="http://schemas.android.com/apk/res/<span style="color:#ff0000;">android</span>

res/后面的包名不同。

在AndroidStudio中可以设置为这样:

xmlns:custom="http://schemas.android.com/apk/<span style="color:#ff0000;">res-auto</span>

四、效果图如下





  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Studio高级UI组件是指在Android Studio使用的一些高级用户界面组件,例如RecyclerView、CardView、TabLayout、NavigationView等。这些组件可以帮助开发者更快速、更方便地构建复杂的用户界面,提高应用程序的用户体验。同时,这些组件也提供了许多自定义选项,可以根据开发者的需求进行定制。 ### 回答2: Android Studio 高级 UI 组件是一系列能够使 Android 应用程序更加炫酷且功能强大的 UI 控件和工具,这些控件和工具包括 RecyclerView、CardView、TabLayout、NavigationView、AppBarLayout、CollapsingToolbarLayout、ViewPager、DrawerLayout 和 CoordinatorLayout 等。 RecyclerView 是用于展示列表数据的强大控件,它支持不同类型的项目并能够通过多种布局管理器实现各种不同的布局。这个控件应用广泛,并且具有很强的灵活性,可以定制化开发满足业务需求的功能。 CardView 是一种可以让应用程序的内容看起来更加精美和专业的控件,它拥有扁平化的外观和阴影效果,可以将里面的 View 按照属性组合成为卡片式的 UI。 TabLayout 是一种可以用于实现选项卡式 UI 的控件,使用它可以方便的创建选项卡,同时支持字体渐变,支持图标和文本等等。 NavigationView 是一种可以用于侧滑菜单 UI 的控件,仅需要简单的配置即可使用,并支持添加一个或多个菜单项和表头自定义等功能。 AppBarLayout 是一种可以用于实现带有 Toolbar 等控件的布局 UI 的控件,可以结合 CoordinatorLayout 使用实现和 NestedScrollView 等控件联动滑动的效果。 CollapsingToolbarLayout 是一种可以让应用程序的 Toolbar 拥有响应垂直滚动手势的能力的控件,常用于实现 AppBarLayout 的滚动式 Toolbar。 ViewPager 是一种可以创建滑动式布局的控件,支持左右滑动切换页面效果,并且可以与 Fragment 搭配使用,实现复杂 UI 的变化。 DrawerLayout 是一种可以创建带有导航抽屉式 UI 的控件,它可以与 NavigationView 结合使用实现菜单导航的功能。 CoordinatorLayout 是一种可以让应用程序的不同组件之间实现联动效果的控件,可以简单易用实现 Toolbar 和 RecyclerView 组件的联动效果,也可以结合其他控件实现更复杂的联动式 UI。 以上这些控件和工具能够为开发者提供更灵活、更酷炫的 UI 界面,就算不是高级开发者也可以很好的掌握它们,用来提升应用程序的品质和用户体验。 ### 回答3: Android Studio是一种非常受欢迎的移动应用程序开发工具,为开发人员提供了一种创建各种UI组件的方法。高级UI组件是指那些更为复杂、功能更丰富、可定制化性更强的组件,可以让开发人员更快地构建高质量的应用程序。 以下是几个高级UI组件: 1. RecyclerView:RecyclerView是一个用于显示大数据集合的高级列表控件。 它提供高度自定义化、线程安全和轻松滚动的功能。 RecyclerView具有一些比传统ListView更好的优点。它可以提高性能、支持更快的滚动速度、数据持续性和动画。因此,没有时间浪费,请及早转向RecyclerView。 2. 碎片(Fragments):Fragment是一种声明性UI组件,可以将用户界面分成多个独立且可重复使用的部件。 碎片允许您设计为横向垂直屏幕,通过使用动态添加方法进行扩展变化。 碎片也可以管理自己的生命周期,可以更好地掌控您的UI等。 3. CardView:CardView是一个用于显示包含多个元素的复杂布局的UI组件。 它是一个普遍被广泛应用的工具,使应用程序开发人员可以欣赏到一个三维特定组件。 它提供很多预定义的事件和方法,可以帮助您在应用程序快速构建卡片布局。 4. CoordinatorLayout:CoordinateLayout是一个强大的UI组件,可以让开发人员在应用程序实现不同的动画效果。 它可以轻松控制以使用线性布局不容易实现的滚动效果,例如响应滚动工具栏、卡式布局和可折叠式布局等。 总之,Android Studio提供了丰富的高级UI组件,可以让开发人员实现快速、高效的应用程序开发。 这些组件可以极大地提高应用的用户体验,并且可以定制化使其符合个人需要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值