涉及到的方法一共有下面几个:
1.view获取自身原始的坐标:getLeft(),getTop(),getRight(),getBottom()
getLeft():获取到的是view自身的左边到其父布局左边的距离
getTop():获取到的是view自身的顶边到其父布局顶边的距离
getRight():获取到的是view自身的右边到其父布局左边的距离
getBottom():获取到的是view自身的底边到其父布局顶边的距离
2.view获取自身经过偏移后的坐标:getX(),getY()
getX():获取到的 mLeft+getTranslationX(),mLeft就是getLeft()的值
getY():获取到的 mTop+getTranslationY(),mTop就是getTop()的值
3.view获取自身的宽高:getHeight(),getWidth()
getHeight():获取到的 mTop-mBottom的值
getWidth():获取到的 mRight-mLeft的值
4.view获取内容的偏移量:getScrollX(),getScrollY()
5.view获取自身的偏移量:getTranslationX(),getTranslationY()
6.motionEvent获取点击事件的坐标:getX(),getY(),getRawX(),getRawY()
getX():获取点击事件相对控件左边的x轴坐标,即点击事件距离控件左边的距离
getY():获取点击事件相对控件顶边的y轴坐标,即点击事件距离控件顶边的距离
getRawX():获取点击事件相对整个屏幕左边的x轴坐标,即点击事件距离整个屏幕左边的距离
getRawY():获取点击事件相对整个屏幕顶边的y轴坐标,即点击事件距离整个屏幕顶边的距离
下面有一张从炸斯特的博客android之View坐标系(view获取自身坐标的方法和点击事件中坐标的获取)上copy过来的图,清晰明了地解释了以上的一些定义:
我自己也写了一个demo
代码如下:
public class ViewTestActivity extends Activity implements View.OnClickListener { private String TAG = "ViewTestActivity"; private View mSlider; private View mScrolltoBtn; private View mLayoutBtn; private View mTranslateBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_viewtest); initView(); } private void initView() { mSlider = findViewById(R.id.slider); mScrolltoBtn = findViewById(R.id.scrollto); mLayoutBtn = findViewById(R.id.layout); mTranslateBtn = findViewById(R.id.translate); mScrolltoBtn.setOnClickListener(this); mLayoutBtn.setOnClickListener(this); mTranslateBtn.setOnClickListener(this); mSlider.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.scrollto: mSlider.scrollBy(0, 10); break; case R.id.layout: RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mSlider.getLayoutParams(); params.bottomMargin += 10; mSlider.requestLayout(); break; case R.id.translate: ObjectAnimator translationY = ObjectAnimator.ofFloat(mSlider, "translationY", -500); translationY.start(); break; case R.id.slider: Toast.makeText(ViewTestActivity.this, "I'm clicked", Toast.LENGTH_SHORT).show(); break; } Log.d(TAG, "top=" + mSlider.getTop()); Log.d(TAG, "y=" + mSlider.getY()); Log.d(TAG, "translationY=" + mSlider.getTranslationY()); Log.d(TAG, "scrollY=" + mSlider.getScrollY()); Log.d(TAG, "--------------------------------------------"); } }页面布局如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/slider" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:background="@android:color/holo_red_light" android:gravity="center" android:padding="30dp" android:text="hello" android:textSize="24dp"/> <Button android:id="@+id/scrollto" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="scrollto"/> <Button android:id="@+id/layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/scrollto" android:text="layout"/> <Button android:id="@+id/translate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/layout" android:text="translate"/> </RelativeLayout> 在模拟器上跑起来之后是这样的:
有如下几个发现:
1.当我点击scrollto按钮的时候,根据log发现,只有scrollY的值发生了改变,从效果上来看就是红色滑块的内容hello向上偏移了,证明了scrollTo()(scrollBy()内部就是调用的srcollTo())只改变view的内容而非其本身。
2.当我点击layout按钮时,根据log发现,只有top和y的值发生了改变并且两个值始终一样,因为每次都是页面重新布局了,并没有内容的偏移,也没有view自身的偏移。
3.当我点击translate按钮时,根据log发现,top的值没变,y的值和translationY的值发生了改变,但是遵循y = top + translationY。
