2016/05/16

Android setX/setY/getX/getY 與 setLeft/setTop/getLeft/getTop 的差異


Android 提供多種 View 的 (X, Y) 軸位置設定方式,

如: setLayoutParams

如: setLeft / setTop

如: setX / setY

也提供多種取得 (X, Y) 軸位置的方式,

如: getLeft / getTop

如: getX / getY

之間的差異性, 可以參考下面的範例 :

Layout XML :
 XML 內容
<?xml version="1.0"  encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我現在位置"
        />
</AbsoluteLayout>

Main 主程式 :
 程式碼
public class TomKuoTest extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView( R.layout.main_test );
        setTitle("getX/getY 與 getLeft/getTop 差異");
        
        TextView tv = (TextView)findViewById(R.id.textView);
        
        Log.i("test", "===== TextView 尚未變更位置 =====");
        Log.i("test", "getX() / getY() : " + tv.getX() + " / " + tv.getY());
        Log.i("test", "getLeft() / getTop() : " + tv.getLeft() + " / " + tv.getTop());
        
        Log.i("test", "===== TextView 透過 setLayoutParams 變更位置 =====");
        tv.setLayoutParams( new AbsoluteLayout.LayoutParams( LayoutParams.WRAP_CONTENT
                                                           , LayoutParams.WRAP_CONTENT
                                                           , 200
                                                           , 100
                                                           ) );
        Log.i("test", "getX() / getY() : " + tv.getX() + " / " + tv.getY());
        Log.i("test", "getLeft() / getTop() : " + tv.getLeft() + " / " + tv.getTop());
        
        tv.setLeft(300);
        tv.setTop(150);
        Log.i("test", "===== TextView 透過 setLeft / setTop 變更位置 =====");
        Log.i("test", "getX() / getY() : " + tv.getX() + " / " + tv.getY());
        Log.i("test", "getLeft() / getTop() : " + tv.getLeft() + " / " + tv.getTop());
        
        tv.setX(500);
        tv.setY(300);
        Log.i("test", "===== TextView 透過 setX / setY 變更位置 =====");
        Log.i("test", "getX() / getY() : " + tv.getX() + " / " + tv.getY());
        Log.i("test", "getLeft() / getTop() : " + tv.getLeft() + " / " + tv.getTop());
        
        // 不在同一個程序中取得 View 長寬
        new Handler().postDelayed( new Runnable()
        {
            @Override
            public void run()
            {
                TextView tv = (TextView)findViewById(R.id.textView);
                Log.i("test", "Runnable 內 getX() / getY() : " + tv.getX() + " / " + tv.getY());
                Log.i("test", "Runnable 內 getLeft() / getTop() : " + tv.getLeft() + " / " + tv.getTop());
            }
        }, 100 );
    }
}

範例結果, 如下 :