自定义控件(18)---自定义控件之面板思想---addRule

attrs.xml(第一步,在这里)

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <!-- R.styleable.TopBar_titleTextColor在R文件中是这样的形式 -->  
  4.     <declare-styleable name="TopBar">  
  5.   
  6.         <!-- 文字 -->  
  7.         <attr name="leftText" format="string" />  
  8.         <attr name="rightText" format="string" />  
  9.         <attr name="titleText" format="string" />  
  10.         <!-- 文字颜色 -->  
  11.         <attr name="leftTextColor" format="color" />  
  12.         <attr name="rightTextColor" format="color" />  
  13.         <attr name="titleTextColor" format="color" />  
  14.         <!-- 文字大小 -->  
  15.         <attr name="titleTextSize" format="dimension" />  
  16.         <!-- 背景色 -->  
  17.         <attr name="leftBackground" format="reference|color" />  
  18.         <attr name="rightBackground" format="reference|color" />  
  19.     </declare-styleable>  
  20.   
  21. </resources>  

activity_main.xml(命名空间需要注意)

[html]  view plain copy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     xmlns:app="http://schemas.android.com/apk/res/com.example.custometopbarui"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     tools:context="com.sloop.topbar.MainActivity" >  
  7.   
  8.     <com.example.custometopbarui.TopBar  
  9.         android:id="@+id/topbar"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:minHeight="48dp"  
  13.         app:leftBackground="@drawable/ic_launcher"  
  14.         app:leftText="左侧"  
  15.         app:rightBackground="@drawable/ic_launcher"  
  16.         app:rightText="右侧"  
  17.         app:titleText="自定义标题"  
  18.         app:titleTextColor="#ffffff"  
  19.         app:titleTextSize="8sp" >  
  20.     </com.example.custometopbarui.TopBar>  
  21.   
  22. </RelativeLayout>  
TopBar(注释很详细)

[java]  view plain copy
  1. package com.example.custometopbarui;  
  2.   
  3. import android.content.Context;  
  4. import android.content.res.TypedArray;  
  5. import android.graphics.Color;  
  6. import android.graphics.drawable.Drawable;  
  7. import android.util.AttributeSet;  
  8. import android.view.Gravity;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11. import android.widget.Button;  
  12. import android.widget.RelativeLayout;  
  13. import android.widget.TextView;  
  14.   
  15.   
  16.   
  17. public class TopBar extends RelativeLayout {  
  18.   
  19.     /** 
  20.      * 定义三个控件, 
  21.      */  
  22.     private Button leftButton, rightButton;  
  23.     private TextView title;  
  24.   
  25.     //左侧button属性  
  26.     private int leftTextColor;  
  27.     private Drawable leftBackground;  
  28.     private String leftText;  
  29.   
  30.     //右侧button属性  
  31.     private int rightTextColor;  
  32.     private Drawable rightBackground;  
  33.     private String rightText;  
  34.   
  35.     //title属性  
  36.     private int titleTextColor;  
  37.     private float titleTextSize;  
  38.     private String titleText;  
  39.   
  40.     //因为容器  
  41.     private LayoutParams leftParams, rirhtParams, titleParams;  
  42.   
  43.     //定义接口对象  
  44.     private TopBarClickListener listener;  
  45.   
  46.     /** 
  47.      * 点击事件监听器接口 
  48.      * @author Administrator 
  49.      * 
  50.      */  
  51.     public interface TopBarClickListener {  
  52.   
  53.         public void leftclick();  
  54.   
  55.         public void rightclick();  
  56.     }  
  57.   
  58.     //设置监听器  
  59.     public void setOnTopBarClickListener(TopBarClickListener listener){  
  60.         this.listener = listener;  
  61.     }  
  62.   
  63.     /** 
  64.      * 对外暴露的方法 
  65.      * @param visible 
  66.      */  
  67.     public void setLeftIsVisible(boolean visible){  
  68.         if (visible) {  
  69.             leftButton.setVisibility(View.VISIBLE);  
  70.         } else {  
  71.             leftButton.setVisibility(View.GONE);  
  72.         }  
  73.     }  
  74.     public void setRightIsVisible(boolean visible){  
  75.         if (visible) {  
  76.             rightButton.setVisibility(View.VISIBLE);  
  77.         } else {  
  78.             rightButton.setVisibility(View.GONE);  
  79.         }  
  80.     }  
  81.   
  82.     /** 
  83.      * 构造器 
  84.      * @param context 
  85.      * @param attrs 
  86.      */  
  87.     public TopBar(Context context, AttributeSet attrs){  
  88.   
  89.         super(context, attrs);  
  90.         //获取自定义属性和值的映射集合  
  91.         TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TopBar);  
  92.   
  93.         //取出自定义属性 - 左侧  
  94.         leftTextColor = ta.getColor(R.styleable.TopBar_leftTextColor, Color.BLACK);  
  95.         leftBackground = ta.getDrawable(R.styleable.TopBar_leftBackground);  
  96.         leftText = ta.getString(R.styleable.TopBar_leftText);  
  97.   
  98.         //取出自定义属性 - 右侧  
  99.         rightTextColor = ta.getColor(R.styleable.TopBar_rightTextColor, Color.BLACK);  
  100.         rightBackground = ta.getDrawable(R.styleable.TopBar_rightBackground);  
  101.         rightText = ta.getString(R.styleable.TopBar_rightText);  
  102.   
  103.         //取出自定义属性 - 标题  
  104.         titleTextColor = ta.getColor(R.styleable.TopBar_titleTextColor, Color.BLACK);  
  105.         titleTextSize = ta.getDimension(R.styleable.TopBar_titleTextSize, 12);  
  106.         titleText = ta.getString(R.styleable.TopBar_titleText);  
  107.         //回收TypedArray(避免浪费资源,避免因为缓存导致的错误)  
  108.   
  109.         ta.recycle();  
  110.   
  111.         /** 
  112.          * 创建控件对象 
  113.          */  
  114.         leftButton = new Button(context);  
  115.         rightButton = new Button(context);  
  116.         title = new TextView(context);  
  117.   
  118.         /** 
  119.          * 为各个控件设置属性 - 左侧 
  120.          */  
  121.         leftButton.setText(leftText);  
  122.         leftButton.setTextColor(leftTextColor);  
  123.         leftButton.setBackground(leftBackground);  
  124.   
  125.         //设置属性 - 右侧  
  126.         rightButton.setText(rightText);  
  127.         rightButton.setTextColor(rightTextColor);  
  128.         rightButton.setBackground(rightBackground);  
  129.   
  130.         //设置属性 - 标题  
  131.         title.setText(titleText);  
  132.         title.setTextSize(titleTextSize);  
  133.         title.setTextColor(titleTextColor);  
  134.         title.setGravity(Gravity.CENTER);  
  135.   
  136.         //设置整体背景颜色  
  137.         setBackgroundColor(0xfff59563);  
  138.   
  139.         /** 
  140.          * 为各个控件设置布局 - 左 
  141.          */  
  142.         //设置宽高  
  143.         leftParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);  
  144.         //添加规则  
  145.         leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);  
  146.         leftParams.addRule(RelativeLayout.CENTER_VERTICAL, TRUE);  
  147.         addView(leftButton, leftParams);//将按钮添加进布局中  
  148.   
  149.         //设置布局 - 右  
  150.         rirhtParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  151.         rirhtParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);  
  152.         rirhtParams.addRule(RelativeLayout.CENTER_VERTICAL, TRUE);  
  153.         addView(rightButton, rirhtParams);//将按钮添加进布局中  
  154.   
  155.         //设置布局 - 标题  
  156.         titleParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  157.         titleParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE);  
  158.         addView(title, titleParams);//将按钮添加进布局中  
  159.   
  160.         /** 
  161.          * 设置监听器 
  162.          */  
  163.         leftButton.setOnClickListener(new OnClickListener() {  
  164.   
  165.             @Override  
  166.             public void onClick(View v){  
  167.   
  168.                 //这里写一个接口回调方法,让外部去实现即可  
  169.                 listener.leftclick();  
  170.             }  
  171.         });  
  172.         rightButton.setOnClickListener(new OnClickListener() {  
  173.   
  174.             @Override  
  175.             public void onClick(View v){  
  176.   
  177.                 listener.rightclick();  
  178.             }  
  179.         });  
  180.     }  
  181.   
  182. }  


MainActivity

[java]  view plain copy
  1. package com.example.custometopbarui;  
  2.   
  3. import com.example.custometopbarui.TopBar.TopBarClickListener;  
  4.   
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.widget.Toast;  
  8.   
  9.   
  10.   
  11. public class MainActivity extends Activity {  
  12.   
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState){  
  15.   
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.activity_main);  
  18.         TopBar topBar = (TopBar) findViewById(R.id.topbar);  
  19.         topBar.setLeftIsVisible(false);  
  20. //      topBar.setRightIsVisible(false);  
  21.         topBar.setOnTopBarClickListener(new TopBarClickListener() {  
  22.   
  23.             @Override  
  24.             public void rightclick(){  
  25.                 Toast.makeText(MainActivity.this"Right Clicked", Toast.LENGTH_SHORT).show();  
  26.             }  
  27.   
  28.             @Override  
  29.             public void leftclick(){  
  30.                 Toast.makeText(MainActivity.this"Left Clicked", Toast.LENGTH_SHORT).show();  
  31.             }  
  32.         });  
  33.     }  
  34.   
  35. }  

你可能感兴趣的:(自定义控件(18)---自定义控件之面板思想---addRule)