码迷,mamicode.com
首页 > 其他好文 > 详细

自定义属性之LinearLayout ImageView TextView模拟图片文字按钮

时间:2014-07-27 09:48:12      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:

一、资源文件:

1、文字选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:color="#FF111111"/>
    <!-- pressed -->
    <item android:state_focused="true" android:color="#FF222222"/>
    <!-- focused -->
    <item android:state_selected="true" android:color="#FF333333"/>
    <!-- selected -->
    <item android:state_active="true" android:color="#FF444444"/>
    <!-- active -->
    <item android:state_checkable="true" android:color="#FF555555"/>
    <!-- checkable -->
    <item android:state_checked="true" android:color="#FF666666"/>
    <!-- checked -->
    <item android:state_enabled="true" android:color="#FF777777"/>
    <!-- enabled -->
    <item android:state_window_focused="true" android:color="#FF888888"/>
    <!-- window_focused -->

</selector>

  2、背景选择器:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke
        android:width="0.5dip"
        android:color="#ff9d9d9d" />

    <corners android:radius="2dip" >
    </corners>

    <padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip"/>
    
    <gradient android:startColor="#ff9d9d9d"
        android:centerColor="#ff9e9e9e"
        android:endColor="#ff9d9d9d"
        />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke
        android:width="0.5dip"
        android:color="#ff505050" />

    <corners android:radius="2dip" >
    </corners>

    <padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip"/>
    
    <gradient android:startColor="#ff404040"
        android:centerColor="#ff383838"
        android:endColor="#ff404040"
        />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/item_background" android:state_enabled="true" android:state_window_focused="false"/>
    <item android:drawable="@drawable/item_background_selected" android:state_pressed="true"/>
    <item android:drawable="@drawable/item_background" android:state_focused="true"/>
    <item android:drawable="@drawable/item_background"/>

</selector>

3、属性文件:

 <!-- imageview text -->
    <declare-styleable name="ImageViewText">
        <attr name="image_size" format="dimension" />
        <attr name="image_src" format="reference" />
        <attr name="textSize" format="dimension" />
        <attr name="text" format="string" />
        <attr name="textMargin" format="dimension" />
        <attr name="textColor" format="reference" />
        <!-- 取值  left top right bottom  -->
        <attr name="text_direction" format="string" />
        <attr name="state_normal" format="color" />
        <attr name="state_pressed" format="color" />
        <attr name="state_selected" format="color" />
        <attr name="view_background" format="reference" />
    </declare-styleable>

二、自定义图片文字:

  1、采用后台代码实现:

public class ImageViewText2 extends LinearLayout {
    private ImageView mImageView;
    private TextView mTextView;

    private View view;

    public ImageViewText2(Context context) {
        super(context);
        initView(context, null);
    }

    // 在父控件中添加android:clickable=“true”
    // android:focusable=“true”,而在子控件中添加android:duplicateParentState=“true”子控件就能获得父控件的点击事件
    public ImageViewText2(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context, attrs);
    }

    private void initView(Context context, AttributeSet attrs) {
         
        mImageView = new ImageView(context);
        mTextView = new TextView(context);
        view = this;
        view.setBackgroundColor(Color.GRAY);
        this.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
//        this.setPadding(5, 5, 5, 5);

        view.setClickable(true);
        view.setFocusable(true);
        view.setOnClickListener(ocl);
//        view.setOnTouchListener(otl);

        TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.ImageViewText);
        float textSize = typedArray.getDimension(R.styleable.ImageViewText_textSize, 14);
        textSize = textSize/3;
        String text = typedArray.getString(R.styleable.ImageViewText_text);
        float textMarginLeft = typedArray.getDimension(R.styleable.ImageViewText_textMargin, 10);
        float image_size = typedArray.getDimension(R.styleable.ImageViewText_image_size, 10);

        int pressed = typedArray.getColor(R.styleable.ImageViewText_state_pressed, Color.BLACK);
        int normal = typedArray.getColor(R.styleable.ImageViewText_state_normal, Color.BLACK);
        int selected = typedArray.getColor(R.styleable.ImageViewText_state_selected, Color.BLACK);
         

        int background = typedArray.getResourceId(R.styleable.ImageViewText_view_background, 0);
        int image_src = typedArray.getResourceId(R.styleable.ImageViewText_image_src, 0);
        if (image_src!=0) {
            mImageView.setBackgroundResource(image_src);
        }
        if (background!=0) {
            view.setBackgroundResource(background);
        }
        
        
        String text_direction = typedArray.getString(R.styleable.ImageViewText_text_direction);
        mTextView.setText(text);

        mTextView.setTextSize(textSize);
        mTextView.setTextColor(createColorStateList(normal,pressed,selected));

        LayoutParams imageLayoutParams = new LayoutParams((int) image_size,
                (int) image_size);
  
        mImageView.setLayoutParams(imageLayoutParams);

        typedArray.recycle();//
        
        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT);
        if (TextDirection.LEFT.equals(text_direction)) {
            this.setOrientation(HORIZONTAL);
            params.rightMargin = (int) textMarginLeft;
            mTextView.setLayoutParams(params);
            addView(mTextView);
            addView(mImageView);
            
        } else if (TextDirection.RIGHT.equals(text_direction)) {
            this.setOrientation(HORIZONTAL);
            params.leftMargin = (int) textMarginLeft;
            mTextView.setLayoutParams(params);
            addView(mImageView);
            addView(mTextView);
        } else if (TextDirection.TOP.equals(text_direction)) {
            this.setOrientation(VERTICAL);
            params.bottomMargin = (int) textMarginLeft;
            mTextView.setLayoutParams(params);
            addView(mTextView);
            addView(mImageView);
        } else if (TextDirection.BOTTOM.equals(text_direction)) {
            this.setOrientation(VERTICAL);
            params.topMargin = (int) textMarginLeft;
            mTextView.setLayoutParams(params);
            addView(mImageView);
            addView(mTextView);
        }
    }

    public OnClickListener ocl = new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (listener != null) {
                listener.onClick(v);
            }
        }
    };

//    public OnTouchListener otl = new OnTouchListener() {
//        @Override
//        public boolean onTouch(View v, MotionEvent event) {
//            if (event.getAction() == MotionEvent.ACTION_DOWN) {
//                view.setBackgroundColor(context.getResources().getColor(
//                        R.color.blue_shallow));
//            } else if (event.getAction() == MotionEvent.ACTION_UP) {
//                view.setBackgroundColor(Color.GRAY);
//            }
//            return false;
//        }
//    };

    public OnClickListenerView listener;

    public void setOnClickListener(OnClickListenerView listenerView) {
        this.listener = listenerView;
    }

    public interface OnClickListenerView {
        public void onClick(View v);
    }

    /** 对TextView设置不同状态时其文字颜色。 */
    private ColorStateList createColorStateList(int normal, int pressed,
            int selected) {
        int[] colors = new int[] { pressed,  selected, normal };
        int[][] states = new int[3][];
        states[0] = new int[] { android.R.attr.state_pressed,
                android.R.attr.state_enabled };
        states[1] = new int[] { android.R.attr.selectable,
                android.R.attr.state_focused };
        states[2] = new int[] {};
         
        ColorStateList colorList = new ColorStateList(states, colors);
        return colorList;
    }

    /** 设置Selector。 */
    public static StateListDrawable newSelector(Context context, int idNormal,
            int idPressed, int idFocused, int idUnable) {
        StateListDrawable bg = new StateListDrawable();
        Drawable normal = idNormal == -1 ? null : context.getResources()
                .getDrawable(idNormal);
        Drawable pressed = idPressed == -1 ? null : context.getResources()
                .getDrawable(idPressed);
        Drawable focused = idFocused == -1 ? null : context.getResources()
                .getDrawable(idFocused);
        Drawable unable = idUnable == -1 ? null : context.getResources()
                .getDrawable(idUnable);
        // View.PRESSED_ENABLED_STATE_SET
        bg.addState(new int[] { android.R.attr.state_pressed,
                android.R.attr.state_enabled }, pressed);
        // View.ENABLED_FOCUSED_STATE_SET
        bg.addState(new int[] { android.R.attr.state_enabled,
                android.R.attr.state_focused }, focused);
        // View.ENABLED_STATE_SET
        bg.addState(new int[] { android.R.attr.state_enabled }, normal);
        // View.FOCUSED_STATE_SET
        bg.addState(new int[] { android.R.attr.state_focused }, focused);
        // View.WINDOW_FOCUSED_STATE_SET
        bg.addState(new int[] { android.R.attr.state_window_focused }, unable);
        // View.EMPTY_STATE_SET
        bg.addState(new int[] {}, normal);
        return bg;
    }

    public class TextDirection {
        public static final String LEFT = "left";
        public static final String TOP = "top";
        public static final String RIGHT = "right";
        public static final String BOTTOM = "bottom";
    }
}

  2、采用后台代码和布局文件:

注意属性duplicateParentState的使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#ffffffff"
    android:orientation="horizontal"
    android:gravity="center_vertical"
    android:padding="5dip"
      >

    <ImageView
        android:id="@+id/iv_button_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/home" />

    <TextView
        android:id="@+id/tv_button_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@drawable/text_wbcolor_selector"
        android:duplicateParentState="true"
        android:text="收藏" />

</LinearLayout>

 

package com.example.customui.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.customui.R;

public class ImageViewText extends LinearLayout  {
    private Context context;
    private LayoutInflater inflater;
    private ImageView mImageView;
    private TextView mTextView;
    
    private View view;

    public ImageViewText(Context context) {
        super(context);
        initView(context,null);
    }

    //在父控件中添加android:clickable=“true” android:focusable=“true”,而在子控件中添加android:duplicateParentState=“true”子控件就能获得父控件的点击事件
    public ImageViewText(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context,attrs);
    }

    private void initView(Context context, AttributeSet attrs) {
        this.context = context;
        inflater = LayoutInflater.from(context);
        view = inflater.inflate(R.layout.widget_image_text, null);

        mImageView = (ImageView) view.findViewById(R.id.iv_button_icon);
        mTextView = (TextView) view.findViewById(R.id.tv_button_text);
        
        this.setGravity(Gravity.CENTER_VERTICAL|Gravity.LEFT);
        this.setOrientation(HORIZONTAL);
        this.setPadding(5, 5, 5, 5);

        view.setClickable(true);
        view.setFocusable(true);
        view.setOnClickListener(ocl);
        view.setOnTouchListener(otl);
 
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ImageViewText);
        float textSize = a.getDimension(R.styleable.ImageViewText_textSize, 14);
        textSize = textSize/3;
        String text = a.getString(R.styleable.ImageViewText_text);
        float textMarginLeft = a.getDimension(R.styleable.ImageViewText_textMargin, 10);
        float image_size = a.getDimension(R.styleable.ImageViewText_image_size, 10);
        
        mTextView.setText(text);
        mTextView.setTextSize(textSize);
 
        LayoutParams params  = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.leftMargin = (int) textMarginLeft;
        mTextView.setLayoutParams(params);
        mImageView.getLayoutParams().height=(int) image_size;
        mImageView.getLayoutParams().width=(int) image_size;
        mImageView.setImageResource(R.drawable.home);
         
         
        a.recycle();// 
        view.setBackgroundColor(Color.GRAY);
        addView(view,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
 
    }

    public OnClickListener ocl = new OnClickListener() {
        @Override
        public void onClick(View v) {
//            listener.onClick(v);
        }
    };
    

    /**
     * 设置颜色
     */
    public OnTouchListener otl = new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                view.setBackgroundColor(context.getResources().getColor(R.color.blue_shallow));
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                view.setBackgroundColor(Color.GRAY);
            }
            return false;
        }
    };
    
    public OnClickListenerView listener;
    
    public void setOnClickListener(OnClickListenerView listenerView){
        this.listener = listenerView;
    }
    
    public interface OnClickListenerView{
        public void onClick(View v);
    }

}

 

自定义属性之LinearLayout ImageView TextView模拟图片文字按钮

标签:

原文地址:http://www.cnblogs.com/lbangel/p/3870361.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!