【问题标题】:How can I get ImageView position with support Right To Left direction如何获得支持从右到左方向的 ImageView 位置
【发布时间】:2017-08-22 08:09:24
【问题描述】:

我想以编程方式获取 ImageView 的位置。该位置是相对于屏幕而不是父级的 imageView 的像素。实际上,我在搜索它们时找到了一些解决方案,虽然布局方向是从左到右,但是当我将方向更改为从右到左时,它给了我奇怪的值(这是 isseu)。 当活动支持 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);

更新

在我的活动中,我有三个 imageviews ,我将(翻译动画) 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 时没有看到动画。为什么会这样?

感谢您的帮助。

【问题讨论】:

  • 是的,getLocationOnScreen 就是你想要的
  • 我使用这种方法,但它给了我屏幕边框之外的价值。不知道为什么?
  • 那么你得到了什么?
  • 当 ltr imageView_top = 42, imageView_left = 168, 但是当 rtl imageView_top = 426, imageView_left = 168
  • 在我的活动中,我有三个 imageviews ,我将(翻译动画) image3 从 image1 移动到 image2 。开始从位置 image1 移动到位置 image2,当我使用 ltr 时,它的动画是正确的,但是当我更改 supportrtl="true" 时,我根本看不到动画。

标签: android layout imageview right-to-left


【解决方案1】:

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

解决方案是改用Property Animations

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

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

这会创建一个 ObjectAnimator,它会在 1500 毫秒的持续时间内在 [xFROM...xTO] 范围内调用 setX() 方法来修改 imageViewFLOAT 的 x 坐标,然后立即启动它。

使用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 动画问题的简单方法。

【讨论】:

  • 您如何获得FROMTO 值?您想对这两个集合使用getX()getY()。我想我忘了在答案中提到这一点。我没想到,因为我们在聊天中讨论过。
  • 啊,很好。很高兴我能帮上忙。稍后,当我有机会编写足够的更新时,我会更新答案。干杯!
  • 嗯,不。我在我的 KitKat 设备上对其进行了测试,效果很好。
  • 哦,这只是你的布局。 View 高程直到 API 级别 21 才引入,因此浮动 View 上的 translationZ 属性在 KitKat 上没有任何作用。在那个版本和更早的版本中,View 的 z 位置仅取决于它在子 Views 列表中的位置。也就是说,父布局中最先列出的Views 是“在底部”;即,在 z 轴上离你更远。它实际上是动画,但它在其他Views 后面,所以你看不到它。将 piece_FLOAT &lt;ImageView&gt; 移动到布局的末尾,就在结束 &lt;/RelativeLayout&gt; 标记之前
  • 没问题。我自己花了一分钟才弄清楚那里发生了什么。这绝对不是立即显而易见的。真高兴你做到了。干杯!
猜你喜欢
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 2011-03-18
  • 2019-04-07
  • 2011-09-19
  • 2016-04-26
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多