首页 > 代码库 > 自定义属性之LinearLayout ImageView TextView模拟图片文字按钮
自定义属性之LinearLayout ImageView TextView模拟图片文字按钮
一、资源文件:
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 = http://www.mamicode.com/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模拟图片文字按钮
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。