自定义控件实战-Android UI模板设计(文末小彩蛋)

原创 2016年08月29日 15:19:12

先简单说一下实现方向:



接下来我们一步步实现方向:

1.设计所需属性:

在value目录下新建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="leftBackground" format="reference|color"/>
        <attr name="leftText" format="string"/>
        <attr name="leftTextColor" format="color"/>

        <attr name="rightBackground" format="reference|color"/>
        <attr name="rightText" format="string"/>
        <attr name="rightTextColor" format="color"/>

    </declare-styleable>
</resources>


2.实现我们的View:

新建类继承RelativeLayout,重写构造方法,并在构造方法里进行映射,对应的属性赋值:

package com.quan.car.topbar;

import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

/**
 * Created by 权兴权意 on 2016/8/29.
 */
public class TopBar extends RelativeLayout{

    private Button leftButton,rightButton;
    private TextView middleTitle;

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

    private int leftTextColor;
    private Drawable leftBackground;
    private String leftText;

    private float titleTextSize;
    private int titleTextColor;
    private String title;

    private LayoutParams leftParams,rightParams,titleParams;

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public TopBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        //自定义属性值映射
        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);
        titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize,0);
        titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor,0);
        title = ta.getString(R.styleable.TopBar_title);

        ta.recycle();//回收,节约资源,避免错误;

        leftButton = new Button(context);
        rightButton = new Button(context);
        middleTitle = new TextView(context);

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

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

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

        setBackgroundColor(0xFFF59563);

        leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,TRUE);
        addView(leftButton,leftParams);

        rightParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,TRUE);
        addView(rightButton,rightParams);

        titleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.MATCH_PARENT);
        titleParams.addRule(RelativeLayout.CENTER_IN_PARENT,TRUE);
        addView(middleTitle,titleParams);
    }
}

3.引用View并模块化开发定义接口设置回调事件,

引用自定义控件:

定义命名空间:

    xmlns:custom="http://schemas.android.com/apk/res-auto"
引用控件并设置属性:

    <com.quan.car.topbar.TopBar
        android:id="@+id/topbar_tb_main"
        android:layout_height="40dp"
        android:layout_width="match_parent"
        custom:leftText="Back"
        custom:leftTextColor="#FFFFFF"
        custom:rightText="More"
        custom:rightTextColor="#FFFFFF"
        custom:title="自定义标题"
        custom:titleTextColor="#123412"
        custom:titleTextSize="10sp"
        ></com.quan.car.topbar.TopBar>

接口相关:

在TopBar.java中进行定义:

    private topbarClickListener listener;

    //定义接口
    public interface topbarClickListener{
        public void leftClick();
        public void rightClick();
    }

    //暴露方法
    public void setOnTopBarClickListener(topbarClickListener listener){
        this.listener = listener;
    }

leftButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                //Toast.makeText(context,"Left.",Toast.LENGTH_SHORT).show();
                listener.leftClick();
            }
        });
```
        rightButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                //Toast.makeText(context,"Right.",Toast.LENGTH_SHORT).show();
                listener.rightClick();
            }
        });

在MainActivity.java中重写方法,进行注册:

        topBar.setOnTopBarClickListener(new TopBar.topbarClickListener() {
            @Override
            public void leftClick() {
                Toast.makeText(MainActivity.this,"Left.",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void rightClick() {
                Toast.makeText(MainActivity.this,"Right.",Toast.LENGTH_SHORT).show();
            }
        });


核心源代码:

Java:

package com.quan.car.topbar;

import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Build;
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;

/**
 * Created by 权兴权意 on 2016/8/29.
 */
public class TopBar extends RelativeLayout{

    private Button leftButton,rightButton;
    private TextView middleTitle;

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

    private int leftTextColor;
    private Drawable leftBackground;
    private String leftText;

    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;
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public TopBar(final Context context, AttributeSet attrs) {
        super(context, attrs);
        //自定义属性值映射
        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);
        titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize,0);
        titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor,0);
        title = ta.getString(R.styleable.TopBar_title);

        ta.recycle();//回收,节约资源,避免错误;

        leftButton = new Button(context);
        rightButton = new Button(context);
        middleTitle = new TextView(context);

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

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

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

        setBackgroundColor(0xFFF59563);

        leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,TRUE);
        addView(leftButton,leftParams);

        rightParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,TRUE);
        addView(rightButton,rightParams);

        titleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        titleParams.addRule(RelativeLayout.CENTER_IN_PARENT,TRUE);
        addView(middleTitle,titleParams);

        leftButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                //Toast.makeText(context,"Left.",Toast.LENGTH_SHORT).show();
                listener.leftClick();
            }
        });

        rightButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                //Toast.makeText(context,"Right.",Toast.LENGTH_SHORT).show();
                listener.rightClick();
            }
        });
    }

    public void setLeftIsVisiable(boolean flag){
        if(flag){
            leftButton.setVisibility(View.VISIBLE);
        }else{
            leftButton.setVisibility(View.INVISIBLE);
        }
    }
}

xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.quan.car.topbar.MainActivity">

    <com.quan.car.topbar.TopBar
        android:id="@+id/topbar_tb_main"
        android:layout_height="40dp"
        android:layout_width="match_parent"
        custom:leftText="Back"
        custom:leftTextColor="#FFFFFF"
        custom:rightText="More"
        custom:rightTextColor="#FFFFFF"
        custom:title="自定义标题"
        custom:titleTextColor="#123412"
        custom:titleTextSize="10sp"
        ></com.quan.car.topbar.TopBar>

</RelativeLayout>

文末小彩蛋:

窗口切换键:alt+左/右

代码折叠/展开:ctrl+“+”/“-”

查找对应括号:ctrl+“[” / “]”

Surround With:ctrl+alt+t






Android UI设计之<十一>自定义ViewGroup,打造通用的关闭键盘小控件ImeObserverLayout

之前产品那边提了这样的需求:用户输入完信息后要求点击非输入框时要把软键盘隐藏。当时看到这个需求觉得没啥难度也比较实际,于是晕晕乎乎的就实现了,可后来产品那边说了只要有输入框的页面全都要按照这个逻辑来,...

Android UI编程自定义控件ImageButton

  • 2015年01月29日 21:04
  • 764KB
  • 下载

Android UI设计——ListView控件和自定义Adapter(四)

自定义Adapter   这个是ListView中使用最多的一个Adapter适配器,因为我们可以根据自己的意愿去创建数据和数据的布局样式。使用方式灵活,下面我们来学习一下自定义Adapter的具体步...

Android UI设计之<十二>自定义View,实现绚丽的字体大小控制控件FontSliderBar

了解iOS的同学应该知道在iOS中有个UISliderBar控件,在iPhone手机中的设置文字大小中使用了该控件。近来产品提的需求中有一个是更改APP中部分字体大小,虽然技术难度不大但工作量还是有的...

Android UI 之一步步教你自定义控件(自定义属性、合理设计onMeasure、合理设计onDraw等)

Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高。     一个相对完善的自定义控件在布局文件中和Java代...

Android UI 之一步步教你自定义控件(自定义属性、合理设计onMeasure、合理设计onDraw等)

Android UI 之一步步教你自定义控件(自定义属性、合理设计onMeasure、合理设计onDraw等)              分类:             Android UI...

Android UI模板设计--自定义actionbar(topbar)模板(慕课网学习笔记)

学习笔记http://www.imooc.com/learn/247。设置一个自定义的ActionBar。 1 在values文件夹下新建attrs.xml,写上我们自定义的Actionbar的一些...
  • hnyzwtf
  • hnyzwtf
  • 2015年12月18日 17:21
  • 1224

【Android 界面效果15】Android UI 之一步步教你自定义控件(自定义属性、合理设计onMeasure、合理设计onDraw等)

Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高。     一个相对完善的自定义控件在布局文件中和java代码中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义控件实战-Android UI模板设计(文末小彩蛋)
举报原因:
原因补充:

(最多只允许输入30个字)