[安卓开发] 自定义View之一: 组合View
来源:互联网 发布:具体营销数据分析 编辑:程序博客网 时间:2024/06/08 13:48
一、自定义View的分类
1、组合View
2、继承重写View
3、全写View
这里讨论组合View
二、简介
组合View,就是组合一些View来形成一个新的View。例如QQ的头部栏,可以看到左边是ImageView,中间的TextView,右边是TextView,
当界面切换的时候,只是改变了文字。这个时候,我们就可以写一个View,把他们组合起来,形成一个我们的View
三、了解
看平常经常见的设置宽度,你知道前面的android是什么意思吗?
android:layout_width="match_parent"
上面这个前缀 android 是根据 根控件的
xmlns:android="http://schemas.android.com/apk/res/android"
这个来命名的,这是系统的。
如果我们要自定义View的属性,就加这个属性
xmlns:app="http://schemas.android.com/apk/res-auto"
app就是我们定义的前缀名,当然你可以随便修改。
实现类里面通过下面的代码来获取到自定义的属性,
TypedArray ta = mContext.obtainStyledAttributes(attrs,R.styleable.TopBar);
四、实现
这里简单实现一个头部自定义View的demo。效果图: (简陋了点),大家明白意思就行了
1、atts.xml , 自定义View 的属性 ,在values下新建文件atts.xml
<?xml version="1.0" encoding="utf-8"?><resources> <!-- 头部的自定义View的属性 --> <declare-styleable name="TopBar"> <!-- 文字 --> <attr name="title" format="string"/> <attr name="leftText" format="string"/> <attr name="rightText" format="string"/> <!-- 背景 --> <attr name="titleBack" format="reference|color"/> <attr name="leftBack" format="reference|color"/> <attr name="rightBack" format="reference|color"/> <!-- 字体颜色 --> <attr name="titleTextColor" format="color"/> <attr name="leftTextColor" format="color"/> <attr name="rightTextColor" format="color"/> <!-- 字体大小 --> <attr name="leftTextSize" format="dimension"/> <attr name="rightTextSize" format="dimension"/> <attr name="titleTextSize" format="dimension"/> </declare-styleable></resources>
2、新建TopBar.java ,自定义view的内容类
public class TopBar extends LinearLayout { //控件 private Button btHeadLeft; private TextView tvHeadTitle; private Button btHeadRight; //左边的Button private String leftText; private Drawable leftBack; private int leftTextColor; private float leftTextSize; //右边的Button private String rightText; private Drawable rightBack; private int rightTextColor; private float rightTextSize; //中间的标题 private String titleText; private Drawable titleBack; private int titleTextColor; private float titleTextSize; private Context mContext; private LayoutParams leftParams,rightParams,titleParams; public TopBar(Context context) { super(context); } public TopBar(Context context, AttributeSet attrs) { super(context, attrs); this.mContext = context; initView(attrs); initListener(); } /** * 初始化View * @param attrs atts文件 */ private void initView(AttributeSet attrs){ //获取自定义View的值 TypedArray ta = mContext.obtainStyledAttributes(attrs,R.styleable.TopBar); rightText = ta.getString(R.styleable.TopBar_rightText); rightBack = ta.getDrawable(R.styleable.TopBar_rightBack); rightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor,0); rightTextSize = ta.getDimension(R.styleable.TopBar_rightTextSize,0); leftText = ta.getString(R.styleable.TopBar_leftText); leftBack = ta.getDrawable(R.styleable.TopBar_leftBack); leftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor,0); leftTextSize = ta.getDimension(R.styleable.TopBar_leftTextSize,0); titleText = ta.getString(R.styleable.TopBar_title); titleBack = ta.getDrawable(R.styleable.TopBar_titleBack); titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor,0); titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize,0); ta.recycle(); //回收 //初始化控件 btHeadLeft = new Button(mContext); tvHeadTitle = new TextView(mContext); btHeadRight = new Button(mContext); //为控件设置值 btHeadLeft.setText(leftText); btHeadLeft.setTextColor(leftTextColor); btHeadLeft.setTextSize(leftTextSize); btHeadLeft.setBackground(leftBack); btHeadRight.setText(rightText); btHeadRight.setTextColor(rightTextColor); btHeadRight.setTextSize(rightTextSize); btHeadRight.setBackground(rightBack); tvHeadTitle.setText(titleText); tvHeadTitle.setTextColor(titleTextColor); tvHeadTitle.setTextSize(titleTextSize); tvHeadTitle.setBackground(titleBack); //设置View的背景颜色 this.setBackgroundColor(0xFF593363); //设置布局属性 leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); rightParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); titleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); titleParams.weight = 1; tvHeadTitle.setGravity(Gravity.CENTER); this.addView(btHeadLeft,leftParams); this.addView(tvHeadTitle,titleParams); this.addView(btHeadRight,rightParams); } /** * 初始化回调事件 */ private void initListener(){ btHeadLeft.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { iTopBarOnClicklistener.leftOnClick(); } }); btHeadRight.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { iTopBarOnClicklistener.rightOnClick(); } }); tvHeadTitle.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { iTopBarOnClicklistener.titleOnClick(); } }); } public Button getBtHeadLeft() { return btHeadLeft; } public void setBtHeadLeft(Button btHeadLeft) { this.btHeadLeft = btHeadLeft; } public TextView getTvHeadTitle() { return tvHeadTitle; } public void setTvHeadTitle(TextView tvHeadTitle) { this.tvHeadTitle = tvHeadTitle; } public Button getBtHeadRight() { return btHeadRight; } public void setBtHeadRight(Button btHeadRight) { this.btHeadRight = btHeadRight; } public String getLeftText() { return leftText; } public void setLeftText(String leftText) { this.leftText = leftText; } public Drawable getLeftBack() { return leftBack; } public void setLeftBack(Drawable leftBack) { this.leftBack = leftBack; } public int getLeftTextColor() { return leftTextColor; } public void setLeftTextColor(int leftTextColor) { this.leftTextColor = leftTextColor; } public float getLeftTextSize() { return leftTextSize; } public void setLeftTextSize(float leftTextSize) { this.leftTextSize = leftTextSize; } public String getRightText() { return rightText; } public void setRightText(String rightText) { this.rightText = rightText; } public Drawable getRightBack() { return rightBack; } public void setRightBack(Drawable rightBack) { this.rightBack = rightBack; } public int getRightTextColor() { return rightTextColor; } public void setRightTextColor(int rightTextColor) { this.rightTextColor = rightTextColor; } public float getRightTextSize() { return rightTextSize; } public void setRightTextSize(float rightTextSize) { this.rightTextSize = rightTextSize; } public String getTitleText() { return titleText; } public void setTitleText(String titleText) { this.titleText = titleText; } public Drawable getTitleBack() { return titleBack; } public void setTitleBack(Drawable titleBack) { this.titleBack = titleBack; } public int getTitleTextColor() { return titleTextColor; } public void setTitleTextColor(int titleTextColor) { this.titleTextColor = titleTextColor; } public float getTitleTextSize() { return titleTextSize; } public void setTitleTextSize(float titleTextSize) { this.titleTextSize = titleTextSize; } public Context getmContext() { return mContext; } public void setmContext(Context mContext) { this.mContext = mContext; } public LayoutParams getLeftParams() { return leftParams; } public void setLeftParams(LayoutParams leftParams) { this.leftParams = leftParams; } public LayoutParams getRightParams() { return rightParams; } public void setRightParams(LayoutParams rightParams) { this.rightParams = rightParams; } public LayoutParams getTitleParams() { return titleParams; } public void setTitleParams(LayoutParams titleParams) { this.titleParams = titleParams; } /** * 显示隐藏左边的View * @param vis View.VISIABLE ... */ public void setLeftVisibility(int vis){ btHeadLeft.setVisibility(vis); } /** * 显示隐藏右边的View * @param vis View.VISIABLE ... */ public void setRightVisibility(int vis){ btHeadRight.setVisibility(vis); } //点击的回调接口 public void setiTopBarOnClicklistener(ITopBarOnClicklistener iTopBarOnClicklistener) { this.iTopBarOnClicklistener = iTopBarOnClicklistener; } private ITopBarOnClicklistener iTopBarOnClicklistener; public interface ITopBarOnClicklistener{ void leftOnClick(); void titleOnClick(); void rightOnClick(); } public void setTopBarOnClickListener(ITopBarOnClicklistener iTopBarOnClicklistener){ this.iTopBarOnClicklistener = iTopBarOnClicklistener; }}
MainActivty.java
public class MainActivity extends AppCompatActivity implements TopBar.ITopBarOnClicklistener{ private TopBar tbHeader; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tbHeader = (TopBar) findViewById(R.id.tb_header); tbHeader.setiTopBarOnClicklistener(this); tbHeader.setLeftVisibility(View.GONE); } @Override public void leftOnClick() { Toast.makeText(this,"left",Toast.LENGTH_SHORT).show(); } @Override public void titleOnClick() { Toast.makeText(this,"title",Toast.LENGTH_SHORT).show(); } @Override public void rightOnClick() { Toast.makeText(this,"right",Toast.LENGTH_SHORT).show(); }}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> <!-- 通过完整路径来引用自定义View ,app的属性就是自己在atts里面定义的属性 --> <com.example.topbar.TopBar android:id="@+id/tb_header" android:layout_width="match_parent" android:layout_height="50dp" app:leftText="左边" app:leftTextColor="@color/colorAccent" app:leftTextSize="13sp" app:leftBack="@color/colorPrimary" app:rightBack="@color/colorPrimaryDark" app:rightText="右边" app:rightTextColor="@color/colorAccent" app:rightTextSize="12sp" app:title="标题" app:titleTextColor="@color/colorAccent" app:titleTextSize="12sp" /></RelativeLayout>
demo下载: http://download.csdn.net/detail/niubitianping/9578419
2 0
- [安卓开发] 自定义View之一: 组合View
- 安卓开发:组合View实现自定义View
- 安卓开发自定义View
- 安卓自定义View教程之一
- 安卓开发28:自定义View类
- 安卓开发自定义view初体验
- 安卓开发:继承View实现自定义View
- 安卓自定义View
- 安卓自定义view
- 安卓自定义View
- 安卓自定义View
- 安卓自定义view
- 【安卓笔记】自定义view之组合控件
- 安卓开发-自定义view(二)-自定义属性
- 安卓自定义View组件
- 安卓常用自定义View
- 安卓自定义View详解
- 安卓自定义View教程
- 办公室常见问题解决:不能连接局域网的共享打印机
- 页面控制利器——JSTL标签库
- Handler的两种用法
- HTML的dl、dt、dd标记制作表格对决Table制作表
- Linux 系统结构详解
- [安卓开发] 自定义View之一: 组合View
- CenterOS6.5(Minimal) 搭建nginx
- Codeforces Round #311 (Div. 2) C 贪心
- linux下管道的容量以及实现机制
- Jdbc
- cookie
- 实时调度类
- Linux 多线程编程(不限Linux)
- 字符串查找(2)KMP算法