什么是View?

在Android中,什么是View?View是Android中所有控件的基类,不管是简单的TextView,Button还是复杂的LinearLayout和ListView,它们的共同基类都是View;
View是一种界面层的控件的一种抽象,它代表了一个控件,除了View还有ViewGroup,从名字来看ViewGroup可以翻译为控件组,即一组View;
在Android中,ViewGroup也继承了View,这就意味着View可以是单个控件,也可以是由多个控件组成的一组控件;

View的位置参数

View和位置主要由它的四个顶点来决定,分别对应View的四个属性:top、left、right、bottom,top是左上角纵坐标,left是左上角横坐标,right是右下角横坐标,bottom是右下角纵坐标;对应如图所示:


Android View详解_第1张图片 View坐标对应图

根据上图我们可以得到View的宽高和坐标的关系;
width = right - left;
hight = bottom - top;
如何得到View的这四个参数呢?
left = getLeft();
right = getRight();
top = getTop();
bottom = getBottom();
注:从Android 3.0开始,View增加了几个额外的参数:x,y,translationX和translationY,其中xy是View左上角的坐标,而translationX和translationY是View左上角相对于父容器的偏移量。这几个参数也是相对于父容器的坐标;这几个参数的换算关系如下:
x = left + translationX;
y = top + translationY;

View 的滑动

在这里我们主要介绍两种View的滑动
1、使用scrollTo/scrollBy
2、使用动画

一、使用scrollTo/scrollBy

首先我们创建一个布局,有一个TextView和一个Button,当我们点击Button时,移动TextView;初始布局如下


Android View详解_第2张图片 初始布局

当我们调用scrollTo方法时
mTv.scrollTo(-100,-100);
执行上述代码后的界面显示为:


Android View详解_第3张图片 移动后
这里我们可以看到TextView中的text值 Hello World!移动到(-100,-100)的位置,TextView本身并没有移动,所以scrollTo方法移动的只是View中的内容,而非View本身;
这里说一下scrollTo和scrollBy的区别,scrollTo是基于所传递参数的绝对移动,而scrollBy是基于当前位置的相对移动;就是To是我就移动到这个位置就不动了,By是基于我当前的位置继续偏移;

二、使用动画

还是上面的初始布局,这次我们来用动画移动View,首先我们创建一个位移动画xml文件

<?xml version="1.0" encoding="utf-8"?>    

延x轴和y轴平移100的距离

  Animation animation = AnimationUtils.loadAnimation(this, R.anim.move);  mTv.startAnimation(animation);
Android View详解_第4张图片 动画移动后

可以看到动画实现了View的位移,移动的是View本身,而非View中的内容;
另外Android3.0版本之后我们也可以通过View本身的setTranslationX和setTranslationY方法来实现View的滑动,例如实现上面的滑动效果我们也可以用以下代码:

 mTv.setTranslationX(100); mTv.setTranslationY(100);

即View移动到(100,100)的位置,注意该移动方式为绝对移动,即类似于scrollTo;

实例练习

上面我们知道了什么是View以及View坐标的关系和如何获取坐标值,以及View的移动,接下来我们利用上面的知识来做一个小功能来巩固以下,需求是创建一个自定义的TextView,然后在屏幕上随我们的手指滑动而滑动;具体实现思路如下:
注:(这里需要用到View的触摸事件处理,要重写View的onTouchEvent方法,不理解的同学可以自行查阅相关资料)
1、手指按下时我们获取到当前手指的坐标点;
2、手指滑动时我们计算手指的偏移量并根据偏移量移动View
自定义的TextView完全代码如下:

package com.wuba.view;import android.annotation.SuppressLint;import android.content.Context;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.TextView;/** * Created by jiaochenguang on 2018/1/11. */@SuppressLint("AppCompatCustomView")public class MyTextView extends TextView {    private int mX;    private int mY;    float moveX;    float moveY;    public MyTextView(Context context) {        super(context);    }    public MyTextView(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);    }    public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN://手指按下                //按下的时候获取手指触摸的坐标                mX = (int) event.getRawX();                mY = (int) event.getRawY();                break;            case MotionEvent.ACTION_MOVE://手指滑动                //滑动时计算偏移量                moveX = event.getRawX() - mX;                moveY = event.getRawY() - mY;                //随手指移动                setTranslationX(moveX);                setTranslationY(moveY);                break;            case MotionEvent.ACTION_UP://手指松开                break;        }        return true;    }}

上述就是自定义的随手指移动而移动的TextView,有兴趣的可以自行练习一下;
最后我们来总结一下本篇的内容:
1、什么是View,View的概念和定义;
2、View的基本属性和坐标值,以及如何获取;
3、View的移动,自身方法移动和动画移动以及自身移动和动画移动的区别;
4、实例练习;

更多相关文章

  1. Airbnb 动画库Lottie
  2. android控件背景揭密--NinePatch
  3. Android Notes 之 Tween动画 (1)四种基本动画
  4. Android spinner控件的实现
  5. android动态创建控件
  6. Android应用开发——TextView控件属性列表
  7. android动画坐标定义
  8. Android中的动画研究
  9. Android Lottie动画的简单使用

随机推荐

  1. EventBus3 简单使用及注意点
  2. Android中Gallery显示手机中的图片
  3. Android(安卓)View.onMeasure方法的理解
  4. 【android】AsyncTask完全剖析(一)
  5. Android之多点触控实例
  6. Android(安卓)IPC机制—Binder的工作机制
  7. Android(安卓)实现按钮在没有触摸事件时
  8. [随时更新] Android小问题记录
  9. Android技术分享
  10. 【Android测试】Android抓包解析全过程