Android ImageView启动TranslateAnimation之后,如何得到移动过程中的位置。

要求:一个图片从上到下移动,在移动过程中,如果点击,那么可以拖拽图片,放开后继续向下移动。
问题:当imageview.startAnimation(animation)之后,imageview实际上并没有移动。点击imageview的初始位置时,可以监听到onclick事件。但是点击移动中的图片时,就无法监听到onclick事件了。
想法:如果可以得到animation移动过程中的每个时刻的位置,再设置imageview的位置,这样,效果就是点击移动中的图片时能监听到onclick。

不知道这样的想法能不能行的通,想试一下,但是却没找到TranslateAnimation能得到位置的方法。希望大家帮帮忙。用其他方法能实现以上要求的,也请赐教。小弟拜谢了。
>我也没学多久,你说的这种情况我认为用Handler、Runnable处理会有效果
↑不明白什么意思,能说的具体点吗。拜托了。

  我也没学多久,你说的这种情况我认为用Handler、Runnable处理会有效果

  ///////////////////////////////////////////////////////
  你试试下面的代码,我测试过,可行,xml布局文件就是一个absolutelayout,里面一个imageview,自己写

  一个注释都没有,坏习惯,你自己看吧,呵呵~~~

  package com.tianlv.study.temp;

  import android.app.Activity;
  import android.os.Bundle;
  import android.os.Handler;
  import android.util.Log;
  import android.view.MotionEvent;
  import android.view.View;
  import android.view.View.OnTouchListener;
  import android.widget.AbsoluteLayout;
  import android.widget.ImageView;

  public class temp extends Activity {

  private Handler mHandler = new Handler();

  private Runnable mMoveImage = new Runnable(){

  public void run() {
  moveImage();
  }

  };

  private ImageView iView;
  private int downMouseY;
  private AbsoluteLayout.LayoutParams downImagePms;
  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  iView = (ImageView) findViewById(R.id.ImageView01);

  iView.setOnTouchListener(new OnTouchListener(){
  public boolean onTouch(View view, MotionEvent event) {
  if(event.getAction() == MotionEvent.ACTION_DOWN){
  Log.i("debug", "stop");
  downMouseY = (int) event.getRawY();
  downImagePms = (AbsoluteLayout.LayoutParams) iView.getLayoutParams();
  mHandler.removeCallbacks(mMoveImage);
  }

  if(event.getAction() == MotionEvent.ACTION_UP){
  Log.i("debug", "move");
  mHandler.postDelayed(mMoveImage, 500);
  }

  if(event.getAction() == MotionEvent.ACTION_MOVE){
  dragImage((int) event.getRawY()- downMouseY);
  }
  return true;
  }
  });
  }

  private void moveImage(){
  AbsoluteLayout.LayoutParams oldLayPms = (AbsoluteLayout.LayoutParams) iView.getLayoutParams();
  AbsoluteLayout.LayoutParams newLayPms = new AbsoluteLayout.LayoutParams(oldLayPms.width, oldLayPms.height, oldLayPms.x, oldLayPms.y+1);

  iView.setLayoutParams(newLayPms);

  mHandler.removeCallbacks(mMoveImage);

  if(newLayPms.y < 300){
  mHandler.postDelayed(mMoveImage, 500);
  }
  }

  private void dragImage(int y){
  AbsoluteLayout.LayoutParams newLayPms = new AbsoluteLayout.LayoutParams(downImagePms.width, downImagePms.height, downImagePms.x, downImagePms.y+y);

  iView.setLayoutParams(newLayPms);
  }
  }
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-08-27
  采用Animation.AnimationListener,在onAnimationEnd的方法中改变当前视图利用LayoutParams的setMargins方法重新定位位置。
  代码:
  public void move() {
  jqkjScroll.setEnabled(true);
  Animation mTranslateAnimation = new TranslateAnimation(0, 0, 0,
  -showheight);// 移动
  
  mTranslateAnimation.setDuration(minute);
  // mAnimationSet.setFillAfter(true);
  // mTranslateAnimation.setFillAfter(true);
  mTranslateAnimation
  .setAnimationListener(new Animation.AnimationListener() {
  public void onAnimationStart(Animation animation) {
  if (isNoMenu == false) {
  curent.setVisibility(View.GONE);
  }
  }
  
  public void onAnimationEnd(Animation animation) {
  RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
  contentLayout.getLayoutParams());
  contentImg.setImageResource(R.drawable.open);
  params.setMargins(0, endY - startY, 0, 0);
  contentLayout.clearAnimation();
  contentLayout.setLayoutParams(params);
  jqkjScroll.scrollTo(0, 0);
  isMoveORShowing = false;
  }
  
  public void onAnimationRepeat(Animation animation) {
  
  }
  });
  contentLayout.startAnimation(mTranslateAnimation);
  
  }
  
  public void show() {
  jqkjScroll.setEnabled(false);
  Animation mTranslateAnimation = new TranslateAnimation(0, 0, 0,
  showheight);// 移动
  mTranslateAnimation.setDuration(minute);
  mTranslateAnimation
  .setAnimationListener(new Animation.AnimationListener() {
  public void onAnimationStart(Animation animation) {
  if (isNoMenu == false) {
  curent.setVisibility(View.VISIBLE);
  }
  }
  
  public void onAnimationEnd(Animation animation) {
  contentImg.setImageResource(R.drawable.close);
  isMoveORShowing = false;
  contentLayout.clearAnimation();
  RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
  contentLayout.getLayoutParams());
  params.setMargins(0, showheight + endY - startY, 0, 0);
  
  contentLayout.setLayoutParams(params);
  }
  
  public void onAnimationRepeat(Animation animation) {
  
  }
  });
  contentLayout.startAnimation(mTranslateAnimation);
  }本回答被网友采纳
第2个回答  2011-01-12
关注中