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

时间:2022-11-02 13:49:07

一、资源文件:

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 ImageViewText extends LinearLayout {
private ImageView mImageView;
private TextView mTextView;

private View view;

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

public ImageViewText(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);

Logger.getLogger().e(
"size: "+typedArray.getDimensionPixelSize(R.styleable.ImageViewText_textSize, 0));
// textSize = textSize/3;
String text = typedArray.getString(R.styleable.ImageViewText_text);
float textMarginLeft = typedArray.getDimension(R.styleable.ImageViewText_textMargin, 10);
float image_width = typedArray.getDimension(R.styleable.ImageViewText_image_width, 10);
float image_height = typedArray.getDimension(R.styleable.ImageViewText_image_height, 10);


int textColor = typedArray.getColor(R.styleable.ImageViewText_textColor, Color.TRANSPARENT);
if(textColor!=Color.TRANSPARENT){
mTextView.setTextColor(textColor);
}
else {
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);
mTextView.setTextColor(createColorStateList(normal,pressed,selected));
}


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


LayoutParams imageLayoutParams
= new LayoutParams((int) image_width,
(
int) image_height);

Logger.getLogger().e(
"size: "+textSize+" w: "+image_width+" h: "+image_height );
Logger.getLogger().e(
"size: "+textSize+" w: "+DensityUtil.dip2px(context, image_width)+" h: "+DensityUtil.dip2px(context, image_height) );
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 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;
}



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
="match_parent"
android:layout_height
="match_parent"
android:background
="@drawable/me_app_selector"
android:gravity
="center_vertical"
android:orientation
="horizontal"
android:paddingLeft
="15dip" >

<ImageView
android:id="@+id/iv_button_icon"
android:layout_width
="35dip"
android:layout_height
="35dip"
android:src
="@drawable/me_settings" />

<TextView
android:id="@+id/tv_button_text"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:layout_marginLeft
="10dip"
android:duplicateParentState
="true"
android:text
="收藏"
android:textColor
="@color/blue_shallow"
android:textSize
="@dimen/font_body_16" />

</LinearLayout>

 

 

public class ImageViewText extends LinearLayout {

private LayoutInflater inflater;
private ImageView mImageView;
private TextView mTextView;

private View view;

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

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

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

mImageView
= (ImageView) view.findViewById(R.id.iv_button_icon);
mTextView
= (TextView) view.findViewById(R.id.tv_button_text);
view.setClickable(
true);
view.setFocusable(
true);
view.setOnClickListener(ocl);

TypedArray a
= context.obtainStyledAttributes(attrs,R.styleable.ImageViewText);
String text
= a.getString(R.styleable.ImageViewText_text);
int drawable = a.getResourceId(R.styleable.ImageViewText_image_src, 0);
mTextView.setText(text);
mImageView.setImageResource(drawable);

a.recycle();
addView(view,
new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));

}

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