Viewの座標系およびX、rawX、translationX、scrollXの違い

9534 ワード

変換元:http://blog.csdn.net/whsdu929/article/details/52152520
  http://blog.csdn.net/wxv111/article/details/50901199
Viewの座標系について簡単に説明します.
viewの位置はleft、top、right、bottomの4つの属性で決定され、これらの座標はgetLeft()、getTop()、getRight()、getBottom()で取得できます.この4つの座標は、親コンテナに対する相対座標であることに注意してください.viewが移動すると、これらの座標は変更されません.
Android 3.0から、x、y、translationX、translationYのパラメータがいくつか追加され、いずれも親コンテナに対する座標です.
xはviewの左上隅の横座標を指し、viewが移動するとxが変化する.
translationXとは、viewの左上隅の横座標の親コンテナに対するオフセット量を指し、viewが移動するとtranslationXが変化します.
関係式x=left+translationXが成立します.
rawXは絶対座標であり、画面左上の横座標に対してview自体にgetRawXの方法はなく、この方法は一般にMotionEventオブジェクトで用いられる.
scrollXとは、viewがスライド中にviewの左端とviewコンテンツの左端が水平方向にある距離(translationXとの違いに注意、translationXとはview自体の移動、scrollXはviewのコンテンツ移動)、つまりviewのscrollToまたはscrollByメソッドが呼び出され、view自体は移動せず、viewのコンテンツのみが移動することを意味する.
下の図は理解のためだけです(scrollXとtranslationXの違いに注意する必要があります):

*****************************************************************************
一、背景
前回のビューの位置ではtop,left,bottom,rightといういくつかの座標を紹介し,これらの座標がviewとその存在する親容器の相対位置であることを知った.x,y,translationX,translationYは何をしていますか.これらの座標は、Android API 11(Android 3.0)の後に追加されます.
三、コード
前の例です
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/block1"
        android:layout_width="match_parent"
        android:layout_height="200px"
        android:background="@color/blue"/>

    <RelativeLayout
        android:id="@+id/block2"
        android:layout_below="@+id/block1"
        android:layout_width="match_parent"
        android:layout_height="2000px"
        android:background="@color/red">

        <Button
            android:id="@+id/button"
            android:layout_width="250px"
            android:layout_height="100px"
            android:layout_marginLeft="30px"
            android:layout_marginTop="30px"
            android:text="button"/>
    RelativeLayout>
RelativeLayout>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
(もちろんpxでxmlでは絶対にお勧めしませんが、今回のロゴがはっきり見えるように書くテストプログラムのために)では、ロゴを打ってこれらのコントロールの実際の位置を見てみましょう.
03-16 00:02:41.607 4442-4442/com.example.sakuraisho.scrollapp V/position﹕ button, top:30,left:30:bottom:130,right:280  03-16 00:02:41.607 4442-4442/com.example.sakuraisho.scrollapp V/position﹕ button, x:30.0,y:30.0:translationX:0.0,translationY:0.0  03-16 00:02:41.607 4442-4442/com.example.sakuraisho.scrollapp V/position﹕ block1, top:0,left:0:bottom:200,right:720  03-16 00:02:41.607 4442-4442/com.example.sakuraisho.scrollapp V/position﹕ block1, x:0.0,y:0.0:translationX:0.0,translationY:0.0  03-16 00:02:41.607 4442-4442/com.example.sakuraisho.scrollapp V/position﹕ block2, top:200,left:0:bottom:1118,right:720  03-16 00:02:41.607 4442-4442/com.example.sakuraisho.scrollapp V/position﹕ block2, x:0.0,y:200.0:translationX:0.0,translationY:0.0
四、結論
まず,Viewは平行移動中にtopとleftが元の左上隅の位置情報を表し,その値は変化しないと結論した.平行移動中に変化したのはx,y,translationX,translationYである.x,yはView左上の座標,translationX,translationYは平行移動の距離である.すなわち
x = left + translationX  y = top + translationY
五、検証
方法1:
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) button.getLayoutParams();
params.leftMargin +=300;
button.requestLayout();

1
2
3
上記の方法を採用すると、translationXとtranslationYは依然として0ですが、leftが変化します.これは、直接上の方法がviewの位置を直接変更したことを示しており、平行移動ではありません.では、translationXが0でない場合はいつ現れますか?
方法2:
アニメーションは実際にはViewの位置を変えることができず、応答イベントさえ移動できないと言われています.もちろん、この対応するイベントの問題はプロパティアニメーションの時に解決されました.では、プロパティアニメーションがどのような効果を生むかを試してみましょう.
log(...);
ObjectAnimator.ofFloat(button, "translationX", 0, 100).setDuration(2000).start();
handler.sendEmptyMessageDelayed(1, 3000);

1
2
3
アニメーションの開始前にbuttonの位置を記録し、アニメーションの終了後に位置を記録します.以下のようにします.
03-16 00:39:49.500 25085-25085/com.example.sakuraisho.scrollapp V/position﹕ button, top:30,left:30:bottom:130,right:280  03-16 00:39:49.500 25085-25085/com.example.sakuraisho.scrollapp V/position﹕ button, x:30.0,y:30.0:translationX:0.0,translationY:0.0  03-16 00:39:52.503 25085-25085/com.example.sakuraisho.scrollapp V/position﹕ after button, top:30,left:30:bottom:130,right:280  03-16 00:39:52.503 25085-25085/com.example.sakuraisho.scrollapp V/position﹕ after button, x:130.0,y:30.0:translationX:100.0,translationY:0.0
驚きの発見、translationXは100を平行移動して、xの値も130になって、原始の座標は変化していません!
ボタンのクリックイベント
ふと疑問に思ったのですが、Viewは本当に移されたのでしょうか?それともx、translationXは一時的な状態にすぎません.そうしないと、元の座標leftは何をしますか.buttonにクリックイベントがあれば、アニメーションが終わったら、クリックイベントは正しく応答しますか?
テストの結果、buttonはアニメーションで、アニメーションが終了した後、クリックイベントに正しく応答することができます.だから単純にこれらの座標が表す意味を理解すればいいのです!何の話だ?0以前はアニメーションはViewの映像を操作していたが、Viewの位置パラメータの幅を変えることなく、座標の意味には影響しなかった!
viewを変更したlayoutparamsはviewの元の座標を変更しました.アニメーションで変更された位置は、元の座標が保持されます.しかし、元の場所に元のviewが保存されているわけではありません!混同しないでください.