本来自己写了一个带图片和文本的自定义控件,就是一个LinearLayout里面放了一个ImageView和TextView,但是想要达到点击LinearLayout的时候,对LinearLayout和ImageView都设置了selector改变状态控制,但是当我想要在点击LinearLayout改变状态的同时ImageView也改变状态,倒过来点击ImageView的时候也像点击了LinearLayout一样,说白了就是实现联动效果,点击View1,View2也跟着改变,不知道怎么做到呢?我试了调用performClick()方法,但是图片仍不会改变,不知大家有没有什么思路?android  自定义控件  

解决方案 »

  1.   

    只针对ImageView的ontouch事件处理,
    因为触摸到ImageView,肯定也触摸到了LinearLayout。按下时设置LinearLayout和ImageView的按下效果,
    同样抬起时也设置它们的抬起效果。
      

  2.   

    LinearLayout和ImageView的按下效果和抬起效果都是在selector中预先设置好的,你的想法是这样子获取drawable资源,然后在ontouch()中检测事件对其控制吗?
      

  3.   

    是的  在点击LinearLayout改变状态的同时ImageView也改变状态这个可以用selector,
    但倒过来点击ImageView的时候也像点击了LinearLayout一样,这就没有试过了。
      

  4.   

    看一下这个我写的http://blog.csdn.net/sasoritattoo/article/details/8614410,我就是想在点击ImgTextBtn控件的时候,ImgTextBtn最外层的linearLayout背景会有个state_pressed状态变化,我想让控件中的ImageView也会跟着有state_pressed的状态变化,实现点击一方,另一方也跟着变化;但是现在的情况是各自点击自己,只有自己会变化,无法实现联动效果,如果能够实现联动效果的话,这个控件就比较完美了。
      

  5.   

    如果要实现   倒过来点击ImageView的时候也像点击了LinearLayout一样。
    那最好把imageview和textview点击事件disable掉(在android里点击事件消息应该是从内向外传递的,不同手机貌似还有区别)这样不管你点在哪,都是LinearLayout响应你的点击了
    然后写一个LinearLayou的seclector(同时改变imageview和textview的状态),再这里面当它点击的时候添加你需要的效果就好了。
    自己还没有尝试,不过应该没有问题
      

  6.   

    这样子点击imageview是可以改变linearlayout状态,但是imageview和textview的控件状态仍然无法改变。
    不知到你说的“然后写一个LinearLayou的seclector(同时改变imageview和textview的状态),再这里面当它点击的时候添加你需要的效果就好了。”是什么意思?如何设置让imageview和textview改变
      

  7.   

    这个就是用一个整体的背景,作为LinearLayout的背景,textview和imageview都设置成透明背景,图片背景画死在layout的背景上的,就给LinearLayout写一个选择器。
    说白了就是做两张LinearLayout整体的整个的图片,让它达到你说的那个效果,并不是他们分别都用了选择器,囧,说不明白了...
      

  8.   


    多谢,自己搞定了,重写了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
    下面接贴!