如何获得支持从右到左方向的 ImageView 位置
How can I get ImageView position with support Right To Left direction
我想以编程方式获取我的 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 中,我有三个图像视图,我将(转换动画)图像 3 从图像 1 移动到图像 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>
这是javaclass
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 动画问题的简单方法。
我想以编程方式获取我的 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 中,我有三个图像视图,我将(转换动画)图像 3 从图像 1 移动到图像 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>
这是javaclass
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 动画问题的简单方法。