android 复合 控件,Android 复合控件 图片+文字有选中效果和点击事件

本文介绍如何封装一个自定义的Android控件IconTextView,该控件结合了图片和文字,支持点击反馈效果。通过设置布局方向、图片资源、文字内容及颜色等属性,实现了一个可复用的组件。在MainActivity中展示了其实例化和使用方法,包括监听点击事件的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

封装一个小小的控件,便于复用,分享一下,如果有更好的方法请告知

首先创建复合控件的布局文件

icontextview.xml

android:id="@+id/layout_icontextview"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:gravity="center"

android:orientation="horizontal" >

android:id="@+id/img_icon"

android:layout_width="39dp"

android:layout_height="39dp" />

android:id="@+id/textview_title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textStyle="bold"

android:textSize="20sp"

android:text="电话订购" />

然后创建复合控件类,继承一个LinearLayout

/**

* File: 继承LinearLayout的自定义复合控件。

*  图片+文字,点击时有选中效果,默认水平

*

* @author: wcs   Date: 2015年1月30日

*/

public class IconTextView extends LinearLayout implements OnTouchListener{

/** 图标*/

private ImageView mTextViewIcon  = null;

/** 标题*/

private TextView mTitleTextView = null;

/** 父容器*/

private LinearLayout mIconTextViewLayout = null;

/** 布局监听*/

private IconTextViewListener mListener;

/** 默认icon*/

private int mDefaultIconId;

/** 选中icon*/

private int mPressedIconId;

/** 默认字体颜色*/

private int mDefaultColorId;

/** 选中字体颜色*/

private int mPressedColorId;

public IconTextView(Context context, AttributeSet attrs) {

super(context, attrs);

LayoutInflater.from(context).inflate(R.layout.icontextview, this, true);

init();

}

/********************************************

* 初始化

*/

private void init(){

mTextViewIcon = (ImageView) findViewById(R.id.img_icon);

mTitleTextView = (TextView) findViewById(R.id.textview_title);

mIconTextViewLayout = (LinearLayout) findViewById(R.id.layout_icontextview);

mIconTextViewLayout.setOnTouchListener(this);

}

/********************************************

* 设置布局方向

* @param orientation LinearLayout.VERTICAL or LinearLayout.HORIZONTAL 默认为HORIZONTAL

*/

public void setLayoutOrientation(int orientation){

mIconTextViewLayout.setOrientation(orientation);

}

/********************************************

* 设置icon默认图片

* @param defaultIconId  默认icon

* @param pressedIconId  按下icon

*/

public void setIcon(int defaultIconId, int pressedIconId){

this.mDefaultIconId = defaultIconId;

this.mPressedIconId = pressedIconId;

mTextViewIcon.setBackgroundResource(defaultIconId);

}

/********************************************

* 设置文字

* @param title  标题文字

* @param defaultColorId  默认文字颜色

* @param pressedColorId  按下文字颜色

*/

public void setTitle(String title, int defaultColorId, int pressedColorId){

this.mDefaultColorId = defaultColorId;

this.mPressedColorId = pressedColorId;

mTitleTextView.setText(title);

mTitleTextView.setTextColor(getResources().getColor(mDefaultColorId));

}

/********************************************

* 设置title文字大小

* @param size

*/

public void setTitleTextSize(float textSize){

mTitleTextView.setTextSize(textSize);

}

/********************************************

* 设置icon大小

* @param width

* @param height

*/

public void setIconSize(int width, int height){

android.view.ViewGroup.LayoutParams params = mTextViewIcon.getLayoutParams();

params.width = width;

params.height = height;

mTextViewIcon.setLayoutParams(params);

}

/********************************************

* 为此自定义控件设置监听

* @param listener IconTextViewListener

*/

public void setListener(IconTextViewListener listener){

this.mListener = listener;

}

/********************************************

* 当Event up时调用

*/

private void onClick(){

mListener.onIconTextViewClick();

}

@Override

public boolean onTouch(View v, MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN){

mTitleTextView.setTextColor(getResources().getColor(mPressedColorId));

mTextViewIcon.setBackgroundResource(mPressedIconId);

return true;

}else if (event.getAction() == MotionEvent.ACTION_UP){

mTitleTextView.setTextColor(getResources().getColor(mDefaultColorId));

mTextViewIcon.setBackgroundResource(mDefaultIconId);

onClick();

return true;

}else {

return false;

}

}

}

public interface IconTextViewListener {

void onIconTextViewClick();

}

最后就是实现功能的Activity什么都木有

/**

* @author: wcs

*/

public class MainActivity extends Activity {

/** 图片+文字按钮*/

private IconTextView iconTextView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

iconTextView = (IconTextView) findViewById(R.id.icontextview_call);

//iconTextView.setLayoutOrientation(LinearLayout.VERTICAL);

iconTextView.setLayoutOrientation(LinearLayout.HORIZONTAL);

iconTextView.setIconSize(100, 100);

iconTextView.setTitleTextSize(20f);

// R.drawable.dot_white 默认icon

// R.drawable.dot_red 按下icon

iconTextView.setIcon(R.drawable.dot_white, R.drawable.dot_red);

// R.color.text_unselect_color 默认文字颜色

// R.color.text_select_color 按下文字颜色

iconTextView.setTitle("你懂的!!!", R.color.text_unselect_color, R.color.text_select_color);

iconTextView.setListener(new IconTextViewListener() {

@Override

public void onIconTextViewClick() {

Toast.makeText(getApplicationContext(), "点击控件", Toast.LENGTH_LONG).show();

}

});

}

adddac385c9656a1d0aecb1edc48060a.png

}

然后上两张效果图

a7245090b003d2a8b8aa8d13a98795c2.png

附上Demo地址

http://download.youkuaiyun.com/detail/w315436432/8424957

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值