android - 如何获得支持从右到左方向的 ImageView 位置

标签 android layout imageview right-to-left

我想以编程方式获取我的 ImageView 的位置。该位置是 imageView 相对于屏幕而不是父级的像素。实际上我在搜索它们时找到了一些解决方案虽然布局方向是从左到右,但是当我将方向更改为从右到左时它给了我奇怪的值(这是问题)。 当 Activity 支持 rtl 时,我如何获得位置。

我找到的一些解决方案:

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);

更新

在我的 Activity 中,我有三个 imageviews,我将(translte 动画)image3 从 image1 移动到 image2。开始从位置 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 时,没有看到动画。为什么会这样?

感谢您的帮助。

最佳答案

这里的问题不在于找到 View 的位置,因为它不应该受到布局方向的影响。真正的问题是 View 动画——尤其是那些涉及翻译的动画——显然不能很好地与 RTL 布局一起工作。这并不奇怪,因为 View 动画自第一个 Android 版本就已经存在,但 RTL 支持仅在 API 级别 17 中添加。

解决方案是使用Property Animations相反。

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

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

这将创建一个 ObjectAnimator,它修改 imageViewFLOAT 的 x 坐标 - 通过调用其 setX() 方法 - 在范围 [xFROM...xTO] 超过 1500 毫秒的持续时间,并立即启动它。

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

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

属性动画和它们的类相当简单,并且几乎可以做旧的 View 动画可以做的任何事情。更新代码以使用这些应该是解决 RTL 动画问题的简单方法。

关于android - 如何获得支持从右到左方向的 ImageView 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45812238/

相关文章:

ios - 使用图像选择器将图像加载到两个 Collection View 单元格

java - Android-ParseQuery- HashMap : Hashmap stays empty?

android - 如何在 Android 上为按钮设置背景灯?

java - Android中所有屏幕的尺寸完全相同

android - 如何在不发送新通知的情况下更新通知标题和文本?

flutter - Flutter中不使用Container是否可以做margin

css - 具有圆 Angular 边框的多列 CSS 布局

android - 仪表板布局模式

android - 如何在 Android 中使用 ImageView 显示图像

java - 如何使用 scrollPane JavaFX 显示大于屏幕的图像