8

我是 android 开发的菜鸟,我在使视图无效时遇到问题。我正在使用教程,实施它没有问题。但是,当我更改视图的背景时,它仍然会响应,就好像仍然设置了以前的背景一样。换句话说,我更改了掩码,但我的“touchview”类没有看到新掩码。我没有运气使用 invalidate 来更新视图,并且我已经验证了掩码实际上被重置为背景。任何帮助将不胜感激。

我的代码

@Override
public boolean onMenuItemClick(com.actionbarsherlock.view.MenuItem item) {
    // TODO Auto-generated method stub
    switch (item.getItemId())
    {
        case 1:   // id from the xml file
            if(isMale){
                isMale=false;
                item.setIcon(R.drawable.male_icon);
                imageViewOriginal.setImageResource(R.drawable.woman_front);
                imageViewFlip.setImageResource(R.drawable.woman_back);
                if(isFrontView){
                    myMask.setBackgroundResource(R.drawable.woman_front_mask); //Mask changed here
                }else{
                    myMask.setBackgroundResource(R.drawable.woman_back_mask);  //Mask changed here
                }
            }else{
                isMale=true;
                item.setIcon(R.drawable.female_icon);
                imageViewOriginal.setImageResource(R.drawable.man_front);                   
                imageViewFlip.setImageResource(R.drawable.man_back);
                if(isFrontView){
                    myMask.setBackgroundResource(R.drawable.man_front_mask); //Mask changed here
                }else{
                    myMask.setBackgroundResource(R.drawable.man_back_mask);  //Mask changed here
                }

            }

            touchView.invalidate();
            infoView.invalidate();
            myMask.invalidate(); //Mask View Invalidated here

            return true;   // we handled the click, dont pass it up the chain

        case 2:   // id from the xml file
            if(isFrontView){
                isFrontView=false;
                if(isMale){
                    myMask.setBackgroundResource(R.drawable.man_back_mask); //Mask changed here
                }else{
                    myMask.setBackgroundResource(R.drawable.woman_back_mask); //Mask changed here
                }
            }else{
                isFrontView=true;
                if(isMale){
                    myMask.setBackgroundResource(R.drawable.man_front_mask); //Mask changed here
                }else{
                    myMask.setBackgroundResource(R.drawable.woman_front_mask); //Mask changed here
                }
            }
            FlipAnimator animator = new FlipAnimator(imageViewOriginal, imageViewFlip,
                    imageViewFlip.getWidth() / 2, imageViewFlip.getHeight() / 2);
            if (imageViewOriginal.getVisibility() == View.GONE) {
                animator.reverse();
            }
            flipLayout.startAnimation(animator);

            touchView.invalidate();
            infoView.invalidate();
            myMask.invalidate();  //Mask View Invalidated here

            return true;
    }
    return false;
}
4

1 回答 1

23

我可以考虑两种可能性:

选项 1:您正在从非 UI 线程运行代码。在这种情况下,使用 postInvalidate() 而不是 invalidate()

postInvalidate():导致在事件循环的后续循环中发生无效。使用它来使来自非 UI 线程的视图无效。

选项 2:您正在从 UI 线程运行代码。在这种情况下,我需要您发布更多代码。请记住,这invalidate()是异步的,因为它只在主线程事件队列中安排重绘。这意味着只有在当前代码全部执行后才会执行重绘。

在这种情况下,如果有东西阻塞了你的 UI 线程,你可以使用 AsyncTask 或 Runnable 来执行你的任务。

于 2013-05-18T01:20:06.307 回答