ScrollTo传的是坐标点的值 scrollBy移动的距离,是一

作者:美狮美高梅官方网站

先看布局:Scroll 解释: 滚动 文本框中的起始滚动行

Android开发艺术探索笔记 ——View(一)

相信大家都很熟悉scrollTo()或scrollBy()方法;网上也很多关于scrollTo()或scrollBy()方法的使用或讲解。但对于我这种数学渣来说,感觉有点糊涂,不够深入。
今天我重新认识一下scrollTo()或scrollBy()方法。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro xmlns:tools="http://schemas.android.com/tools" android: android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="test.pgl.com.scrolltext.MainActivity"> <Button android:text="scrollto" android:onClick="scrollto" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="scrollby" android:onClick="scrollby" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android: android:background="#ff00" android:textColor="#00ff00" android:layout_width="300dp" android:layout_height="300dp" android:text="Hello World!" /></LinearLayout>

View的基础知识

1.1scrollTo()或scrollBy()方法

  • 首先该方法是View类的:

美狮美高梅官方网站 1

scrollTo()或scrollBy()方法

非Scroller类,这个是第一个认知;(我也相信很多人会知道的,哈哈...)

ScrollTo 和 ScrollBy

什么是View

View是Android中所有控件的基类。是一种界面层控件的抽象

1.2 scrollBy()方法里面调用scrollTo()方法

美狮美高梅官方网站 2

scrollBy()方法

相信这个也是大家所认知的,对于不耐烦的童鞋,可能直接关闭页面了,O(∩_∩)O哈哈~;

好吧,客官别急,慢慢来嘛,对于我这种学渣来说,为了巩固知识能一个个点记住。

共同点 都可以移动View的内容 传入负数向右yido

View的位置参数

美狮美高梅官方网站 3

Paste_Image.png

美狮美高梅官方网站 4

Paste_Image.png

参数名 获取方式 含义
top getTop() View左上角纵坐标
left getLeft() View左上角横坐标
bottom getBottom() View右下角纵坐标
right getRight() View右下角横坐标
View:x/y getX()/getY() View左上角坐标
translationX getTranslationX() View左上角相对于父容器的偏移量
translationY getTranslationY() View左上角相对于父容器的偏移量
MotionEvent:x/y event.getX()/event.getY() 点击事件相对于View左上角的坐标
MotionEvent:rawX/rawY event.getRawX()/event.getRawY() 点击事件相对于手机屏幕左上角的坐标

1.2.1scrollTo()方法

我们先看看scrollTo方法,的解释:

美狮美高梅官方网站 5

Paste_Image.png

意译:设置你的view的滑动位置。这个会调用onScrollChanged()方法和view的invalidate()方法也会调用。

个人总结:起码这里你会发现原来调用scrollTo(x,y)方法会调用到

ScrollTo传的是坐标点的值 scrollBy移动的距离

MotionEvent

  • ACTION_DOWN
  • ACTION_MOVE
  • ACTION_UP

MotionEvent获取点击事件x,y坐标:

getX/getY 相对于View左上角
getRawX/getRawY 相对于手机屏幕左上角

  //在View或Activity中拦截touch events,重写onTouchEvent方法
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = MotionEventCompat.getActionMasked(event);
        switch (action) {
            case (MotionEvent.ACTION_DOWN):
                Log.d(TAG,"action down");
                return true;
            case (MotionEvent.ACTION_MOVE):
                Log.d(TAG,"action move");
                return true;
            case (MotionEvent.ACTION_UP):
                Log.d(TAG,"action up");
                return true;
            case (MotionEvent.ACTION_CANCEL):
                Log.d(TAG,"action cancel");
                return true;
            case (MotionEvent.ACTION_OUTSIDE):
                Log.d(TAG,"action outside");
                return true;
            default:
                return super.onTouchEvent(event);
        }
    }
    //对于View,可以使用setOnTouchListener()方法来监听touch events而不需要继承现有的View
    View myView = findViewById(R.id.my_view);
myView.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        // ... Respond to touch events
        return true;
    }
});

重识一:onDraw()方法

(invalidate方法会调用onDraw方法);

package test.pgl.com.scrolltext;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.TextView;public class MainActivity extends AppCompatActivity { private TextView tv_text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_text =  findViewById(R.id.tv_text); } public void scrollby(View view) { tv_text.scrollBy; } public void scrollto(View view) { tv_text.scrollTo; }}

TouchSlop

滑动的最小距离,常量,和设备有关。

//获取方式:
ViewConfiguration.get(getContext()).getScaledTouchSlop();

1.2.2 scrollTo方法的正负问题

戏肉来了:
Android Scroller完全解析,关于Scroller你所需知道的一切
这是郭霖郭大神写的关于View的滑动博客:

美狮美高梅官方网站 6

Paste_Image.png

美狮美高梅官方网站 7

Paste_Image.png

这里只看X轴郭大神所说相对于当前位置横向移动的距离;正值向左移动,负值向右;

第一个关键点就出现在这里;当然你可以简单地理解为正值向左移动,负值向右移动。

这里要注意一下:当坐标为"-40"负的时会出现下面这种: 但是这没影响

VelocityTracker

学习资料:
1.https://developer.android.com/training/gestures/movement.html

追踪手指滑动的速度

使用过程:

  //在View的onTouchEvent方法中
  VelocityTracker velocityTracker = VelocityTracker.obtain();
  velocityTracker.addMoveMent(event);

  //时间间隔设为1000ms
  tracker.computeCurrentVelocity(1000);
  int Vx = (int)velocityTracker.getXVelocity();
  int Vy = (int)VelocityTracker.getYVelocity();

  //不再使用的时候,需要清除并回收
  velocityTracker.clear();
  velocityTracker.recycle();

但是

  • 首先需要说明一点View.scrollTo()方法是View的内容移动到指定的位置;怎样理解这句话呢?
    View.scrollTo(-100); 相信看了郭大神的博客很清楚会知道是View的内容移动到 -100那个位置,再调用View.scrollTo(-100);View的内容就不动了。就是上面说的移动到指定位置,这里是与scrollBy()方法不同的。
    上面我说的是View的内容非View本身;非View本身;非View本身;

美狮美高梅官方网站 8Paste_美狮美高梅官方网站,Image.png

GestureDetector

手势监测:单击,滑动,长按,双击等等。

使用方法:

  • 1.实例化GestureDetectorCompat
  • 2.如需监测所有的手势,则实现GestureDetector.OnGestureListener接口和GestureDetector.OnDoubleTapListener接口。
  • 3.若只需监测部分手势,则继承GestureDetector.SimpleOnGestureListener类。
//监测所有的手势
public class MainActivity extends Activity implements
        GestureDetector.OnGestureListener,
        GestureDetector.OnDoubleTapListener{

    private static final String DEBUG_TAG = "Gestures";
    private GestureDetectorCompat mDetector;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //实例化GestureDetectorCompat
        mDetector = new GestureDetectorCompat(this,this);
        //将双击事件交给GestureDetectorCompat监听
        mDetector.setOnDoubleTapListener(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        this.mDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent event) {
        Log.d(DEBUG_TAG,"onDown: " + event.toString());
        return true;
    }

    @Override
    public boolean onFling(MotionEvent event1, MotionEvent event2,
            float velocityX, float velocityY) {
        Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());
        return true;
    }

    @Override
    public void onLongPress(MotionEvent event) {
        Log.d(DEBUG_TAG, "onLongPress: " + event.toString());
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        Log.d(DEBUG_TAG, "onScroll: " + e1.toString()+e2.toString());
        return true;
    }

    @Override
    public void onShowPress(MotionEvent event) {
        Log.d(DEBUG_TAG, "onShowPress: " + event.toString());
    }

    @Override
    public boolean onSingleTapUp(MotionEvent event) {
        Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString());
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent event) {
        Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
        return true;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent event) {
        Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString());
        return true;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent event) {
        Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());
        return true;
    }
}



//监测部分手势
public class MainActivity extends Activity {

    private GestureDetectorCompat mDetector;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDetector = new GestureDetectorCompat(this, new MyGestureListener());
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        this.mDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

    class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
        private static final String DEBUG_TAG = "Gestures";

        @Override
        public boolean onDown(MotionEvent event) {
            Log.d(DEBUG_TAG,"onDown: " + event.toString());
            return true;
        }

        @Override
        public boolean onFling(MotionEvent event1, MotionEvent event2,
                float velocityX, float velocityY) {
            Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());
            return true;
        }
    }
}

什么是View的内容

在任大神任玉刚的《Android开发艺术探索》一书中也提到了View的内容这一说;

根据我的实践经验告诉我View的内容:对于View来说就是draw()内面绘制的内容,即对于View来说View的内容就是绘制内容。
对于ViewGroup来说View的内容就是子View。

本文由美狮美高梅官方网站发布,转载请注明来源

关键词: