对于上述几张图片,他们都有一个共同点,布局差不多,我们可以把它封装成一个共同的控件,通过自定义属性来控制子控件的显示与否与内容的不同,背景的不同。
代码:
package com.android.custom;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.text.TextUtils.TruncateAt;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class TopBar extends RelativeLayout{
private Button leftBtn,rightBtn;
private TextView title;
private TopBarClickListener topBarClickListener;
private String titleStr;
private RelativeLayout.LayoutParams leftBtnLayoutParams,rightBtnLayoutParams,titleLayoutParams;
private static int LEFT_BTN_ID = 1;
private static int TITLE_ID = 2;
private static int RIGHT_BTN_ID = 3;
private Drawable leftBackground,rightBackground;
private String leftText,rightText;
private int leftTextColor,rightTextColor,titleTextColor;
private float titleTextSize;
public TopBar(Context context,AttributeSet attrs){
super(context,attrs);
TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.TopBar);
this.titleStr = ta.getString(R.styleable.TopBar_title);
this.leftBackground = ta.getDrawable(R.styleable.TopBar_leftBackground);
this.rightBackground = ta.getDrawable(R.styleable.TopBar_rightBackground);
this.leftText = ta.getString(R.styleable.TopBar_leftText);
this.rightText = ta.getString(R.styleable.TopBar_rightText);
this.leftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, 0);
this.rightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, 0);
this.titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize, 14);
this.titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor, 0);
ta.recycle();
leftBtn = new Button(context);
rightBtn = new Button(context);
title = new TextView(context);
leftBtn.setId(LEFT_BTN_ID);
rightBtn.setId(RIGHT_BTN_ID);
title.setId(TITLE_ID);
leftBtnLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
rightBtnLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
titleLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
leftBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,RelativeLayout.TRUE);
leftBtnLayoutParams.setMargins(12, 0, 0, 0);//左上右下
leftBtnLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
rightBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);
rightBtnLayoutParams.setMargins(12, 0, 0, 0);//左上右下
rightBtnLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
titleLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);
titleLayoutParams.setMargins(0, 0, 12, 0);//左上右下
titleLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
titleLayoutParams.addRule(RelativeLayout.LEFT_OF, RIGHT_BTN_ID);
titleLayoutParams.addRule(RelativeLayout.RIGHT_OF, LEFT_BTN_ID);
titleLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
addView(leftBtn, leftBtnLayoutParams);
addView(rightBtn,rightBtnLayoutParams);
addView(title,titleLayoutParams);
leftBtn.setBackgroundDrawable(leftBackground);
leftBtn.setText(leftText);
leftBtn.setTextColor(leftTextColor);
rightBtn.setBackgroundDrawable(rightBackground);
rightBtn.setText(rightText);
rightBtn.setTextColor(rightTextColor);
title.setTextSize(22.0f);
title.setTextColor(Color.BLUE);
title.setEllipsize(TruncateAt.MIDDLE);
title.setGravity(Gravity.CENTER_HORIZONTAL);
title.setSingleLine(true);
title.setText(titleStr);
title.setTextSize(titleTextSize);
title.setTextColor(titleTextColor);
leftBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(topBarClickListener!=null){
topBarClickListener.leftBtnClick();
}
}
});
rightBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(topBarClickListener!=null){
topBarClickListener.rightBtnClick();
}
}
});
}
public void setTopBarClickListener(TopBarClickListener topBarClickListener) {
this.topBarClickListener = topBarClickListener;
}
}
package com.android.custom;
public interface TopBarClickListener {
void leftBtnClick();
void rightBtnClick();
}
package com.android.custom;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class CustomViewActivity extends Activity{
private TopBar topBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
topBar = (TopBar)findViewById(R.id.topBar);
topBar.setTopBarClickListener(new TopBarClickListener() {
@Override
public void rightBtnClick() {
//处理右边按钮所对应的逻辑
Toast.makeText(CustomViewActivity.this, "你点击的是右边的按钮", Toast.LENGTH_LONG).show();
}
@Override
public void leftBtnClick() {
//处理左边按钮所对应的逻辑
Toast.makeText(CustomViewActivity.this, "你点击的是左边的按钮", Toast.LENGTH_LONG).show();
}
});
}
}
在res/xml文件夹下面新建attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="TopBar">
<attr name="title" format="string"/>
<attr name="titleTextSize" format="dimension"/>
<attr name="titleTextColor" format="color"/>
<attr name="leftTextColor" format="color"/>
<attr name="leftBackground" format="string"/>
<attr name="leftText" format="string"/>
<attr name="rightTextColor" format="color"/>
<attr name="rightBackground" format="string"/>
<attr name="rightText" format="string"/>
</declare-styleable>
</resources>
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.android.custom"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="fill_parent" android:background="#ff00ff00" />
<com.android.custom.TopBar android:id="@+id/topBar"
custom:title="自定义标题" custom:titleTextSize="14.0sp" custom:titleTextColor="#ff0000" android:layout_width="fill_parent"
custom:leftBackground="@drawable/icon" custom:rightBackground="@drawable/icon"
custom:leftText="左侧" custom:rightText="右侧"
custom:leftTextColor="#123123" custom:rightTextColor="#ff0000"
android:layout_height="wrap_content" android:background="#0000ff">
</com.android.custom.TopBar>
</FrameLayout>
ps:美化的工作就交给你们自己了,隐藏的属性忘记添加了
- 大小: 10.9 KB
- 大小: 11.7 KB
- 大小: 10.5 KB
- 大小: 10.1 KB
- 大小: 18.9 KB
- 大小: 93.7 KB
分享到:
相关推荐
前两篇介绍了自定义控件的基础原理Android自定义控件基本原理详解(一)、Android自定义控件之自定义属性(二)。今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本。 使用...
有时,原生控件可以通过复杂的编码实现想要的功能,这时候可以自定义控件来提高代码的可复用性。 如何自定义控件 下面我通过我在github上开源的Android-CalendarView项目为例,来介绍一下自定义控件的方法。该项目中...
自定义HeadView,提供多种常见title开发类型,实现控件的复用,提高开发效率.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
没有使用自定义控件,使用Handler机制的延时消息,实现了在ListView中添加倒计时控件的方法,复用Item且没有图片错位。
前面已学习了一种自定义控件的实现,是Andriod 自定义控件之音频条,还没学习的同学可以学习下,学习了的同学也要去温习下,一定要自己完全的掌握了,再继续学习,贪多嚼不烂可不是好的学习方法,我们争取学习了一种...
欢迎大家来学习本节内容,前几节我们已经学习了其他几种自定义控件,分别是Andriod 自定义控件之音频条及 Andriod 自定义控件之创建可以复用的组合控件还没有学习的同学请先去学习下,因为本节将使用到上几节所讲述...
自定义ImageView控件,具有缩放和拖拽功能,适合图片的浏览,方便复用
东西网上找的,完美模仿iPhone的滑动开关效果,然后让美工帮我切了图,去掉了一些乱七八糟的东西, 只留下纯控件.有监听,能设置初始值,可复用! 苦点小分.
高效省内存的播放序列帧控件,支持从文件,resource读取序列帧,内存复用,读取多张只需一张图片内存
作者Blincheng,源码CountdownDemo,这是一个 【Android】自定义倒计时控件 解决复用、线程安全、列表不展示时的回调等问题 。
Android UI模板设计 TopBar 标题栏的设计 自定义控件 很好的实现了topBar控件的复用性
比较好的一种做法是使用include标签,复用同一个xml文件来实现布局的复用。但是这种方法是通过代码的方式来设置标题,左右按钮等其他的属性,会导致布局属性和Activity代码耦合性比较高。 因此,我们要通过自定义...
最近项目做用户登录模块需要一个右边带图片的EditText,图片可以设置点击效果,所以就查资料做了一个自定义EditText出来,方便以后复用。 原理 下面是自定义EditText的代码,具体难点是要实现图片的点击监听,...
在自定义view时为了提高复用性和扩展性,可以为自定义的view添加样式属性的配置,比如自定义图片资源、文字大小、控件属性等,就这需要用到TypedArray类,下面以一个自定义的可点击扩展和收缩的TextView为例记录下...
android popupWindows ListView 实现下拉列表, 封装好的自定义控件,直接可以复用。
注意,本控件非继承自ViewGroup,而是纯自定义View,实现的仿饿了么加入购物车控件,自带闪转腾挪动画的按钮。 图1 项目中使用的效果,考虑到了View的回收复用, 并且可以看到在RecyclerView中使用,切换...
学习启舰的自定义控件三部曲视图篇(七)——RecyclerView系列之四实现回收复用,记录一下自己的理解,方便以后复习查看。 回收复用主要有两部分:(直接copy) 第一:在onLayoutChildren初始布局时: 使用 ...