Android ImageView正在之前的图像上绘制新图像。

3

我希望在每次触摸事件时更改ImageView上显示的图像。以下代码可以实现这一点。

public class TelephoneFragment extends Fragment {

ImageView telephoneImageView;

@Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.telephone_fragment,
        container, false);
    telephoneImageView = (ImageView)view.findViewById(R.id.telephoneImageView);
    telephoneImageView.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_DOWN){
                telephoneImageView.setImageDrawable(getResources().getDrawable(R.drawable.telephone_clicked));
            }
            if(event.getAction() == MotionEvent.ACTION_UP){
                telephoneImageView.setImageDrawable(getResources().getDrawable(R.drawable.telephone));
            }
            return true;    
        }
    });
    return view;
  }

然而,存在一个问题,当我改变手机的方向并再次尝试触摸图像时,新的图像会重叠在以前的图像上,也就是说,以前的图像仍然可见在背景中。有人能指导我发生了什么吗?谢谢。

--我也尝试使用setImageResource()而不是setImageDrawable,但问题仍然存在。


你尝试过setImageBitmap吗? - Software Sainath
好的,我也会尝试。 - nave
setImageBitMap 也出现了同样的问题。 - nave
所以,我刚刚意识到当方向改变时,活动会重新启动,我猜这可能与我看到的有关? - nave
那仍然没有解决问题。 - nave
显示剩余2条评论
1个回答

0

在设置第二个可绘制对象之前,您可以使用以下方法来实现此操作。

telephoneImageView.setImageResource(0);

我没有尝试过上述方法,但如果它不起作用,也可以尝试以下方法:

telephoneImageView.setImageResource(android.R.color.transparent);

也可以尝试将ImageView指定为不可见,然后再将其设置为可见。这可能会触发重绘。您还可以尝试上述方法的组合,或者尝试telephoneImageView.invalidate()。


不幸的是,两者都不起作用,似乎一旦方向改变,先前的图像就会在屏幕上固定。 - nave
发生的情况是ImageView为了性能原因没有正确擦除其画布。所以你需要尝试找到一种强制它重新绘制的方法。也许可以结合上述方法和telephoneImageView.invalidate()来实现。我没有亲自尝试过,不确定是否有效。希望能有所帮助。 - Eurig Jones
好的,谢谢。android:configChanges="orientation|screenSize" 看起来解决了问题...虽然我不确定为什么,感觉有点像 hack... - nave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接