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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
  
  
参考技术A   采用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);
  
参考技术B 关注中

android activity ImageView全屏设置

   开始接触android也有1月有余了,看了一小部分的教学视频+刚哥的疯狂讲义。总是看着视频做一些Demo,有些木讷。今天尝试终于进入项目中,在项目中巩固知识点。

   功能1 project启动 显示欢迎页面而后跳转 主页面;

   问题点 1 实现Imange 全屏显示:

   解决方案:

    1.设置image scaleType 属性:

android:scaleType="fitXY"

    2.设置 activity theme 属性:

<activity android:name=".initView"  android:theme="@android:style/Theme.Holo.NoActionBar">

    这里只是改变某一个 activity 的显示效果,所以只修改某一个activity 的样式。这里要注意,在修改 activity 的Theme 的属性后,需要将 对应的实现类 父类修改为android.app.activity否则运行时会报错:

 java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.


    最终看效果如下:

技术分享技术分享









本文出自 “洛山红茶的成长” 博客,请务必保留此出处http://85608547.blog.51cto.com/2093443/1881054

以上是关于Android ImageView启动TranslateAnimation之后,如何得到移动过程中的位置。的主要内容,如果未能解决你的问题,请参考以下文章

Android Widget ImageView 不显示

Android - ImageView 方向因设备而异

怎样设置android中ImageView为不显示?

android activity ImageView全屏设置

一起Talk Android吧(第三百一十二回:ImageView常用属性一)

更改 ImageView 内容会导致 OutOfMemoryError