本来自己写了一个带图片和文本的自定义控件,就是一个LinearLayout里面放了一个ImageView和TextView,但是想要达到点击LinearLayout的时候,对LinearLayout和ImageView都设置了selector改变状态控制,但是当我想要在点击LinearLayout改变状态的同时ImageView也改变状态,倒过来点击ImageView的时候也像点击了LinearLayout一样,说白了就是实现联动效果,点击View1,View2也跟着改变,不知道怎么做到呢?我试了调用performClick()方法,但是图片仍不会改变,不知大家有没有什么思路?android 自定义控件
因为触摸到ImageView,肯定也触摸到了LinearLayout。按下时设置LinearLayout和ImageView的按下效果,
同样抬起时也设置它们的抬起效果。
但倒过来点击ImageView的时候也像点击了LinearLayout一样,这就没有试过了。
那最好把imageview和textview点击事件disable掉(在android里点击事件消息应该是从内向外传递的,不同手机貌似还有区别)这样不管你点在哪,都是LinearLayout响应你的点击了
然后写一个LinearLayou的seclector(同时改变imageview和textview的状态),再这里面当它点击的时候添加你需要的效果就好了。
自己还没有尝试,不过应该没有问题
不知到你说的“然后写一个LinearLayou的seclector(同时改变imageview和textview的状态),再这里面当它点击的时候添加你需要的效果就好了。”是什么意思?如何设置让imageview和textview改变
说白了就是做两张LinearLayout整体的整个的图片,让它达到你说的那个效果,并不是他们分别都用了选择器,囧,说不明白了...
多谢,自己搞定了,重写了LinearLayout中的方法:
@Override
public void refreshDrawableState() {
// TODO Auto-generated method stub
super.refreshDrawableState();
//------------接下来处理联动效果,关键代码,请认真看-------------------
//------------ ImageView控件的联动刷新 -------------------
Drawable imgDrawable = mImg.getBackground(); //获取drawable资源
Log.d(TAG, "drawable = " + imgDrawable);
if (imgDrawable != null && imgDrawable.isStateful()) {
//关键中的关键,根据当前状态设置drawable的状态,本来应该是LinearLayout的getDrawableState()状态,
//但是现在是实现联动效果,而且获取的ImageView的getDrawState()结果不对。
imgDrawable.setState(this.getDrawableState());
}
//------------- TextView的联动刷新, 抱歉, 无法刷新 ------------------
//这块代码很快写出来了,但是写出来后发现,颜色总是停留在最后一次的颜色上,后面再点击都无法改变颜色了,
//才恍然大悟,mTV.setTextColor()是设置TextView内部的ColorStateList对象的,这样会清掉原先的
//res/color/colorSelector.xml里的设置,导致只有一种颜色值。应该赋值给TextView内部的private int mCurTextColor;
//可惜没有并设置mCurTextColor值的接口,不知到使用反射能否做到,有兴趣朋友可以一试。
//既然Text的color是靠TextPaint刷出来的,那么是否可以改变TextPaint的颜色值呢?发现有接口getPaint可以获取到TextPaint,
//但是设置了color值之后,还是不行,哦,原来在onDraw()函数中,重新设置了颜色值,所以白设了。
//总而言之,联动刷新颜色是不行滴,只能设一个颜色(对于我目前来讲功能已经是足够了) 哈哈,讲的够详细吧~~
ColorStateList mTextColor = mTV.getTextColors();
int color = mTextColor.getColorForState(this.getDrawableState(), 0);
if (mTV.getCurrentTextColor() != color) {
mTV.getPaint().setColor(color);
// mTV.setTextColor(color);
mTV.invalidate();
}
//-----------如果有个Button的话就可以在这里设置改变,效果同上,略---------------
// Drawable btnDrawable = mBtn.getBackground();
// Log.d(TAG, "drawable = " + btnDrawable);
// if (btnDrawable != null && btnDrawable.isStateful()) {
// btnDrawable.setState(this.getDrawableState());
// }
//
// ColorStateList mTextColor2 = mBtn.getTextColors();
// int color2 = mTextColor2.getColorForState(this.getDrawableState(), 0);
// if (mBtn.getCurrentTextColor() != color2) {
// mBtn.setTextColor(color2);
// }
}
更详细的请看http://blog.csdn.net/sasoritattoo/article/details/8614410
下面接贴!