1、什么是View
View是Android中所有控件的基类,还有ViewGroup,翻译是控件组,ViewGroup也是继承了View,所以其实ViewGroup本身是一个控件只是其内部可能包含了许多控件。
2、View的位置参数
- top 左上角的纵坐标
- left 左上角的横坐标
- bottom 右下角的纵坐标
- right 右下角的横坐标
需要注意的是这些参数都是基于父容器来说的,并不是屏幕。
这是布局xml:
<?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" android:orientation="vertical"> <TextView android:id="@+id/view_ima1" android:layout_width="200dp" android:layout_height="200dp" android:layout_marginLeft="50dp" android:layout_marginTop="50dp" android:background="@color/colorPrimary"/> <Button android:id="@+id/view_button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"/> </RelativeLayout>
然后是Activity的Java代码:
public class ViewActivity extends AppCompatActivity { private final static String TAG = "ViewActivity"; private TextView textView; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view); textView = (TextView) findViewById(R.id.view_ima1); button = (Button) findViewById(R.id.view_button1); //打印信息 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.d(TAG,"textView_top = " + textView.getTop()); Log.d(TAG,"textView_left = " + textView.getLeft()); Log.d(TAG,"textView_bottom = " + textView.getBottom()); Log.d(TAG,"textView_right = " + textView.getRight()); } }); } }
这里要注意的是不能直接在onCreate中使用getLeft, getRight, getTop, getBottom,这样直接使用返回的结果将是0,因为View的绘制晚于Activity的创建。
然后还要注意dp和像素的区别。不同的手机不一样。
从Android3.0开始,View在平移的过程中,top和left表示的是原始左上角的位置信息,其值不会发生改变。在平移过程中发生改变的x,y,translationX,translationY,x,y是View左上角的坐标,translationX,translationY是平移的距离。
x = left + translationX
y = top + translationY
3、View的滑动
public class ima extends AppCompatImageView { Scroller mScroller = new Scroller(getContext()); public ima(Context context) { super(context); } public ima(Context context, AttributeSet attrs) { super(context, attrs); } public ima(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } //缓慢滚动到指定位置 public void smoothScrollTo(int destX, int destY){ int scrollX = getScrollX(); int deltaX = scrollX - destX; //1000ms弹性滑动,效果就慢慢滑动 mScroller.startScroll(scrollX,0,deltaX,0,1000); invalidate(); } @Override public void computeScroll() { if(mScroller.computeScrollOffset()){ scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); postInvalidate(); } } }
这是我自定义的一个ima控件继承自AppCompatImageView。其中构造函数是直接继承来的。这里使用了Scroller实现View的弹性滑动。