`
helloandroid
  • 浏览: 275830 次
  • 性别: Icon_minigender_1
  • 来自: 成都
博客专栏
107f8db3-b009-3b79-938a-dafddb49ea79
Android腾讯微博客户...
浏览量:95728
社区版块
存档分类
最新评论

android自定义控件以及复用控件

阅读更多










对于上述几张图片,他们都有一个共同点,布局差不多,我们可以把它封装成一个共同的控件,通过自定义属性来控制子控件的显示与否与内容的不同,背景的不同。

代码:
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
分享到:
评论
2 楼 eity0323 2012-03-23  
1 楼 AndLi 2011-09-30  
不错,学习了!

相关推荐

    Android自定义控件开发入门与实战.zip

    《Android自定义控件开发入门与实战》这本书深入浅出地讲解了如何在Android平台上创建和使用自定义控件,旨在帮助开发者从基础知识到实战技巧,全方位掌握这一核心技术。 一、自定义控件基础 自定义控件在Android中...

    Android自定义控件示例

    这个压缩包“CustomViews”很可能是包含了一系列Android自定义控件的示例项目,旨在帮助开发者理解和学习如何在Android Studio 1.0.2环境下创建和使用自定义控件。 自定义控件通常涉及以下关键知识点: 1. **...

    【Android进阶】(1)用继承和组合方式自定义控件

    在Android开发中,自定义控件是提升应用用户体验和界面设计独特性的重要手段。本教程主要探讨如何通过继承和组合的方式来自定义控件,适用于已经有一定Android基础的开发者进行进阶学习。 首先,我们来理解自定义...

    android自定义控件源码

    本资源"android自定义控件源码"提供了一套详细的自定义控件实现案例,帮助开发者深入理解自定义控件的工作原理和实现方法。配合文章《Android自定义控件深度解析》(文章地址:...

    安卓自定义控件相关-Android自定义控件源码.rar

    这个压缩包"Android自定义控件源码.rar"包含了一些自定义控件的源代码,虽然不能保证每个都可直接运行,但它们提供了丰富的学习资源,帮助开发者理解和实践自定义控件的创建过程。下面将详细探讨Android自定义控件的...

    Android 自定义控件 组合控件

    在实际开发中,为了提高代码复用性,我们通常会将自定义控件的布局文件单独创建。这样,在XML布局文件中就可以像使用系统自带控件一样使用自定义控件,只需要引入对应的XML标签即可。 最后,考虑到`custom_widget`...

    Android 自定义控件简单Demo

    至此,我们完成了一个简单的Android自定义控件,它能展示图片和文字。然而,自定义控件的能力远不止于此。你可以添加更多的功能,如触摸事件处理、动画效果,甚至动态改变内容。通过深入理解Android的绘图API和布局...

    《Android自定义控件入门到实战》源码2018.10

    《Android自定义控件入门到实战》是一本深入讲解Android平台下自定义控件开发的教程,源码2018.10版提供了一套完整的实践案例,帮助开发者从基础到进阶全面掌握自定义控件的制作技巧。这份资料涵盖了从基本的自定义...

    自定义控件Demo

    在Android开发中,自定义控件是提升应用界面独特...通过学习和分析`customcontrols`中的代码,开发者可以深入理解Android自定义控件的工作原理,提高自己的Android开发技能,同时也能为今后的项目开发积累宝贵的经验。

    Android 自定义组合控件案例

    4. 模块化:将复杂的自定义控件拆分为多个小的可复用组件,便于维护。 五、使用自定义控件 1. 在布局文件中引入:通过标签添加到XML布局中,并设置相应的属性。 2. 在代码中创建:通过new MyCustomView(context)...

    Android自定义控件实现导航条IndicatorView

    在Android应用开发中,自定义控件是提升用户体验和界面个性化的重要手段。本文将深入探讨如何实现一个自定义的...不断学习和实践,将帮助你更好地理解和掌握Android自定义控件的精髓,为你的应用带来更丰富的用户体验。

    Android 自定义控件

    本文将深入讲解如何进行Android自定义控件的开发,包括理解View的工作原理、创建自定义控件的几种方式以及如何为自定义控件添加属性。 首先,我们需要理解View的基本结构和工作原理。Android的视图系统采用组合模式...

    Android自定义组合控件

    在Android开发中,自定义控件是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何根据【标题】"Android自定义...如果你下载并研究这个"自定义组合控件"的示例,相信你会对Android自定义控件有更深入的理解。

    Android自定义控件开发.rar

    这份"Android自定义控件开发.rar"压缩包包含了一本名为《Android自定义控件开发入门与实战》的PDF教程,旨在帮助Android开发者深入理解和实践自定义控件的创建。 自定义控件在Android开发中的价值主要体现在以下几...

    android 开发进阶 自定义控件 类似 TextView

    8. **性能优化**:在设计自定义控件时,要考虑到性能因素,避免在`onDraw()`方法中执行耗时操作,合理使用`Viewholder`模式,以及考虑复用机制,尤其在列表或滚动场景下。 在`MyComstomView`这个文件中,可能包含了...

    android 自定义控件与特效

    在Android开发中,自定义控件与特效是提升应用界面独特性和用户...以上是Android自定义控件与特效的一些核心概念和实践技巧,开发者通过深入理解和熟练运用这些知识点,能够创建出独具特色且功能丰富的Android应用。

    android自定义控件及其属性设置

    在Android开发中,自定义控件是提升应用独特性和用户体验的重要手段。自定义控件允许开发者根据需求扩展标准Android组件,实现独特的交互效果和视觉样式。本教程将深入探讨如何在Android中创建自定义控件及其属性...

    Android自定义控件视频下载链接

    本篇内容将深入探讨Android自定义控件的相关知识点,以帮助开发者更好地理解和运用这一技术。 一、自定义控件基础 1. 继承体系:自定义控件通常基于已有的View或ViewGroup类进行扩展。你可以选择直接继承View类,...

    Android 自定义控件DemoCustomView-ImageButton

    1. **自定义控件基础**:Android自定义控件分为两类,一类是继承已有的系统控件,如`ImageButton`,另一类是完全自定义的新组件,通常继承自`View`或`ViewGroup`。在这个例子中,我们关注的是第一种情况。 2. **`...

Global site tag (gtag.js) - Google Analytics