对于上述几张图片,他们都有一个共同点,布局差不多,我们可以把它封装成一个共同的控件,通过自定义属性来控制子控件的显示与否与内容的不同,背景的不同。
代码:
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平台上创建和使用自定义控件,旨在帮助开发者从基础知识到实战技巧,全方位掌握这一核心技术。 一、自定义控件基础 自定义控件在Android中...
这个压缩包“CustomViews”很可能是包含了一系列Android自定义控件的示例项目,旨在帮助开发者理解和学习如何在Android Studio 1.0.2环境下创建和使用自定义控件。 自定义控件通常涉及以下关键知识点: 1. **...
在Android开发中,自定义控件是提升应用用户体验和界面设计独特性的重要手段。本教程主要探讨如何通过继承和组合的方式来自定义控件,适用于已经有一定Android基础的开发者进行进阶学习。 首先,我们来理解自定义...
本资源"android自定义控件源码"提供了一套详细的自定义控件实现案例,帮助开发者深入理解自定义控件的工作原理和实现方法。配合文章《Android自定义控件深度解析》(文章地址:...
这个压缩包"Android自定义控件源码.rar"包含了一些自定义控件的源代码,虽然不能保证每个都可直接运行,但它们提供了丰富的学习资源,帮助开发者理解和实践自定义控件的创建过程。下面将详细探讨Android自定义控件的...
在实际开发中,为了提高代码复用性,我们通常会将自定义控件的布局文件单独创建。这样,在XML布局文件中就可以像使用系统自带控件一样使用自定义控件,只需要引入对应的XML标签即可。 最后,考虑到`custom_widget`...
至此,我们完成了一个简单的Android自定义控件,它能展示图片和文字。然而,自定义控件的能力远不止于此。你可以添加更多的功能,如触摸事件处理、动画效果,甚至动态改变内容。通过深入理解Android的绘图API和布局...
《Android自定义控件入门到实战》是一本深入讲解Android平台下自定义控件开发的教程,源码2018.10版提供了一套完整的实践案例,帮助开发者从基础到进阶全面掌握自定义控件的制作技巧。这份资料涵盖了从基本的自定义...
在Android开发中,自定义控件是提升应用界面独特...通过学习和分析`customcontrols`中的代码,开发者可以深入理解Android自定义控件的工作原理,提高自己的Android开发技能,同时也能为今后的项目开发积累宝贵的经验。
4. 模块化:将复杂的自定义控件拆分为多个小的可复用组件,便于维护。 五、使用自定义控件 1. 在布局文件中引入:通过标签添加到XML布局中,并设置相应的属性。 2. 在代码中创建:通过new MyCustomView(context)...
在Android应用开发中,自定义控件是提升用户体验和界面个性化的重要手段。本文将深入探讨如何实现一个自定义的...不断学习和实践,将帮助你更好地理解和掌握Android自定义控件的精髓,为你的应用带来更丰富的用户体验。
本文将深入讲解如何进行Android自定义控件的开发,包括理解View的工作原理、创建自定义控件的几种方式以及如何为自定义控件添加属性。 首先,我们需要理解View的基本结构和工作原理。Android的视图系统采用组合模式...
在Android开发中,自定义控件是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何根据【标题】"Android自定义...如果你下载并研究这个"自定义组合控件"的示例,相信你会对Android自定义控件有更深入的理解。
这份"Android自定义控件开发.rar"压缩包包含了一本名为《Android自定义控件开发入门与实战》的PDF教程,旨在帮助Android开发者深入理解和实践自定义控件的创建。 自定义控件在Android开发中的价值主要体现在以下几...
8. **性能优化**:在设计自定义控件时,要考虑到性能因素,避免在`onDraw()`方法中执行耗时操作,合理使用`Viewholder`模式,以及考虑复用机制,尤其在列表或滚动场景下。 在`MyComstomView`这个文件中,可能包含了...
在Android开发中,自定义控件与特效是提升应用界面独特性和用户...以上是Android自定义控件与特效的一些核心概念和实践技巧,开发者通过深入理解和熟练运用这些知识点,能够创建出独具特色且功能丰富的Android应用。
在Android开发中,自定义控件是提升应用独特性和用户体验的重要手段。自定义控件允许开发者根据需求扩展标准Android组件,实现独特的交互效果和视觉样式。本教程将深入探讨如何在Android中创建自定义控件及其属性...
本篇内容将深入探讨Android自定义控件的相关知识点,以帮助开发者更好地理解和运用这一技术。 一、自定义控件基础 1. 继承体系:自定义控件通常基于已有的View或ViewGroup类进行扩展。你可以选择直接继承View类,...
1. **自定义控件基础**:Android自定义控件分为两类,一类是继承已有的系统控件,如`ImageButton`,另一类是完全自定义的新组件,通常继承自`View`或`ViewGroup`。在这个例子中,我们关注的是第一种情况。 2. **`...