2010-08-25 63 views
1

我有一个ListView可以有一个或多个可点击的项目。当我应用旋转动画时,单击的坐标对应于ListView项目的原始位置。例如,纵向模式中一个项目旋转180度的列表将使项目在屏幕底部倒置,但当单击屏幕顶部时,该项目会获得单击事件。 180度只是我想要移动任意角度的一个例子。 我已经查看了所有的listView属性,但没有一个对可点击的坐标没有任何影响。我会假设willChangeTransformationMatrix会做的伎俩,但它不,也无效或invalidateViews。是否有我忽略的一个属性,或者我会如何将坐标移至正确的位置?安卓 - 点击旋转的ListView给出错误的坐标

由于点击时

样本代码 - 列表项正确突出,旋转与dpad_center,之后点击原来的位置时旋转的项目突出。我试着动画动画,animationSet和layoutAnimationController所有相同的结果。

public class ToDoList extends Activity { 
    ListView myListView; 
    /** Called when the activity is first created. */ 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    final ListView myListView = new ListView(this); 

    final ArrayList<String> todoItems = new ArrayList<String>(); 
    todoItems.add(0, "asdf"); 
    todoItems.add(0, "1234"); 

    // Create the array adapter to bind the array to the listview 
    final ArrayAdapter<String> aa; 
    aa = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,todoItems); 

    // Bind the array adapter to the listview. 
    myListView.setAdapter(aa); 
    setContentView(myListView); 
    myListView.setOnKeyListener(new OnKeyListener() { 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (event.getAction() == KeyEvent.ACTION_DOWN) 
      if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) 
      { 
       aa.notifyDataSetChanged(); 
       //myEditText.setText(""); 
       RotateAnimation ranim = new RotateAnimation(0f, 180f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 
       ranim.setDuration(1000); 
       ranim.setFillAfter(true); 
       ranim.willChangeBounds(); 
       ranim.willChangeTransformationMatrix(); 
       ranim.setInterpolator(new LinearInterpolator()); 
       myListView.startAnimation(ranim); 
       AnimationSet set = new AnimationSet(true); 
       set.addAnimation(ranim); 
       set.willChangeTransformationMatrix(); 
       set.setInterpolator(new LinearInterpolator()); 
       //set.setFillAfter(true); 
       //set.setFillEnabled(true); 
       LayoutAnimationController controller = new LayoutAnimationController(set, 0.5f); 
       controller.setInterpolator(new LinearInterpolator()); 
       myListView.setLayoutAnimation(controller); 
       return true; 
      } 
      return false; 
     } 
     }); 
    } 
} 

回答

1

您正在获取正确的坐标。 RotateAnimation仅影响View的渲染,而不影响其布局或触摸事件。

+0

我想当我问到“我将如何将坐标移到正确的位置?”通过“正确”我的意思是新近轮换的地方,几乎任何人都希望他们是(在实际点击的项目下)。任何想法? 谢谢 – JA1 2010-08-25 03:33:51

+0

@ JA1:第1步是让你确定如何有一个横向的ListView,没有任何动画。如果你不能在没有动画的情况下做到这一点,你也不能用动画来完成它。由于我没有意识到你可以有一个横向的'ListView',我怀疑你需要修改你的UI计划。 – CommonsWare 2010-08-25 04:36:21

+0

这是非常令人失望的,我曾经看过其他旋转w/out动画的方法,但只发现了如何去ImageViews。我也尝试过动画一个imageView,在屏幕上移动onTouch,并且坐标也不跟着它,你必须重新触摸原始位置重新动画。这似乎是一个巨大的限制,但我仍然认为我忽略了一些简单的东西,或者可能有一些方法来调整坐标。我的意思是一个带有> 10个滚动浏览的ListView的ListView会在项目向外滚动时向位置做一些调整,类似于动画 – JA1 2010-08-25 06:19:12

1

从honeycomb开始,您可以使用新的动画API,允许您同时执行动画和真实运动(或旋转或缩放等)的视图。

对于老版本的android,动画只会改变视图的显示方式。