2017-08-22 17 views
1

プログラムでImageViewの位置を取得したいとします。その位置は、親子ではなくスクリーンに対するピクセル単位のimageViewの位置です。レイアウト方向は左から右ですが、右から左に向かって方向を変更すると、奇妙な値が返されます(これはisseuです)。 アクティビティがrtlをサポートしている場合、どのようにポジションを取得できますか?私が発見したImageViewの位置を右から左の方向に設定するには

いくつかの解決策:私の活動で

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

UPDATE

を私は3 imageviewsを持って、私がイメージ1から画像2の(translteアニメーション)画像3を移動させます。 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> 

、それは非常になりますが、いくつかのピクセルを追加作業LTR、私が使用している場合、これは

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

Javaクラスです。 rtlを使うとアニメーションが見えませんでした。なぜこれが起こるのですか?

ありがとうございました。

+1

はい、 'getLocationOnScreen'はあなたが望むものです – pskink

+0

私はこのメソッドを使用しますが、それは私に画面の境界線の外に値を与えました。何故かはわからない? –

+0

あなたはどうしますか? – pskink

答えて

1

ここでの問題は、実際にはViewの場所を見つけることではないため、レイアウト方向の影響を受けないようにしてください。実際の問題は、Viewアニメーション、特に翻訳を含むアニメーションが、RTLレイアウトではうまく動作しないことです。 ViewのアニメーションはAndroidの最初のバージョン以来ずっとありましたが、RTLサポートはAPIレベル17でのみ追加されています。

解決策は代わりにProperty Animationsを使用することです。これは、その修正ObjectAnimatorを作成

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

:たとえば

は、あなたのスニペットでは、あなたが実際には、x軸に沿ってImageViewので、我々は1行であなたの全体のTranslateAnimationセットアップを置き換えることができることを翻訳しています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アニメーションの問題を簡単に修正できるはずです。

+0

それは男の作品です。アニメーションは機能します。 –

+0

しかし、いくつかのものがありますimage1からimage2に移動していくつかのピクセルを追加する理由は何ですか? ObjectAnimatorを使用するとimage1(20,20)とimage2(40,20)が正しく動くが、y座標にはいくつかのピクセルが追加されます。 image3は(20,56)から(40,56)にアニメーション化されます。 36ピクセルを追加する理由 –

+1

どのように 'FROM'と' TO'値を取得していますか?両方のセットで 'getX()'と 'getY()'を使いたいとします。私はその答えに言及するのを忘れていたと思う。私はそれについて考えなかった。私たちのチャットで議論したからだ。 –

関連する問題