如何通过支持从右到左的方向获取ImageView位置

时间:2017-08-22 08:09:24

标签: android layout imageview right-to-left

我想以编程方式获取ImageView的位置。该位置是针对imageView的相对于屏幕而不是父级的像素。实际上我在搜索工作时找到了一些解决方案虽然布局方向是从左到右,但是当我改变方向从右到左时,它给了我奇怪的值(这是isseu)。 如果活动得到支持,我怎样才能获得该职位。

我发现了一些解决方案:

1) private int getRelativeTop(View myView) {
if (myView.getParent() == myView.getRootView())
    return myView.getTop();
else
    return myView.getTop() + getRelativeTop((View) myView.getParent());} 


2) image.getLocationOnScreen(int[] locaiton);

更新

在我的活动中,我有三个图像视图,我将图像从image1移动到图像2(转换动画)。开始从位置image1移动到位置image2,当我使用ltr时它是正确的动画,但当我改变supportrtl =" true"我根本看不到动画。

这是xml文件

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:id="@+id/rootParent"
    android:orientation="vertical"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/piece_FLOAT"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/piece1"
        android:translationZ="@dimen/activity_horizontal_margin" />


    <ImageView
        android:id="@+id/piece_1"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_margin="8dp"
        android:src="@drawable/piece1" />


    <ImageView
        android:id="@+id/piece_2"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_margin="8dp"
        android:src="@drawable/piece1" />



</LinearLayout>

这是java类

public class AnimateActivity extends AppCompatActivity {


    ImageView  imageViewfrom, imageViewto;
    ImageView  imageViewFLOAT;
    LinearLayout L_33;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_animate);

        imageViewfrom = (ImageView)findViewById(R.id.piece_1);
        imageViewto = (ImageView)findViewById(R.id.piece_2);


        imageViewFLOAT = (ImageView)findViewById(R.id.piece_FLOAT);

        assert imageViewfrom != null;
        assert imageViewto != null;
        imageViewfrom.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int[] ToLocation = new int[2];
                imageViewto.getLocationOnScreen(ToLocation);

                float xTO =  ToLocation[0];//imageViewto.getX(); //ToLocation[0];
                float yTO = ToLocation[1];//imageViewto.getY();//ToLocation[1];

                int[] FromLocation = new int[2];
                imageViewfrom.getLocationOnScreen(FromLocation);
                float xFROM = FromLocation[0];//imageViewfrom.getX();///FromLocation[0];
                float yFROM = FromLocation[1]; //imageViewfrom.getY();//FromLocation[1];

                Log.e("xFrom =" + xFROM, "xTo =" + xTO );
                Log.e("yFrom =" + yFROM, "yTo =" + yTO );
              //  Log.e("offset =" + topOffset, "xTo =" + 0);
                ValueAnimator animatorX = ObjectAnimator.ofFloat(imageViewFLOAT, "x", xFROM, xTO).setDuration(1500);
                ValueAnimator animatorY = ObjectAnimator.ofFloat(imageViewFLOAT, "y", yFROM, yTO).setDuration(1500);
                AnimatorSet animatorSet = new AnimatorSet();
                animatorSet.playTogether(animatorX, animatorY);
                animatorSet.start();
                //  Animation an = new TranslateAnimation(xFROM, xTO, yFROM , yTO);
               // an.setDuration(1500);

  //              an.setFillAfter(true);// to keep the state after animation is finished
//                imageViewFLOAT.startAnimation(an);// to start animation obviously
            }
        });
    }
}

当我使用ltr时,它会工作但会添加一些像素。当我使用rtl动画没有看到。为什么会这样?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这里的问题并不是找到View的位置,因为它不应受布局方向的影响。真正的问题是View动画 - 特别是那些涉及翻译的动画 - 显然不适用于RTL布局。这并不奇怪,因为自第一版Android以来View动画已经存在,但RTL支持仅在API级别17中添加。

解决方案是使用Property Animations代替。

例如,在您的代码段中,您实际上只是沿着x轴翻译ImageView,因此我们可以用一行替换整个TranslateAnimation设置:

ObjectAnimator.ofFloat(imageViewFLOAT, "x", xFROM, xTO).setDuration(1500).start();

这会创建一个ObjectAnimator,通过调用imageViewFLOAT方法修改setX()的x坐标 - 在[xFROM...xTO]范围内持续1500毫秒,并且马上开始吧。

使用AnimatorSet,我们可以将多个动画组合在一起播放,因此您也可以同时执行y-translation。例如:

AnimatorSet as = new AnimatorSet();
as.playTogether(ObjectAnimator.ofFloat(imageViewFLOAT, "x", xFROM, xTO), 
                ObjectAnimator.ofFloat(imageViewFLOAT, "y", yFROM, yTO));
as.setDuration(1500).start();

属性动画及其类非常简单,几乎可以执行旧View动画所能做的任何事情。更新代码以使用这些代码应该是解决RTL动画问题的简单方法。