滑动作效果果入门篇,PageFlipper动态加载View

正文转自:http://software.intel.com/zh-cn/blogs/2012/06/15/android-viewflipper/

1)View切换的控件—ViewFlipper介绍

知识点:

 

ViewFilpper类继承于ViewAnimator类。而ViewAnimator类继承于FrameLayout。

     1.PageFlipper为主用法及动态拉长View;

作者: sunboy123 (1 篇文章) 日期: 六月 15, 2012 在 5:15 下午

 

ViewFilpper
是Android官方提供的2个View容器类,继承于ViewAnimator类,用于落到实处页面切换,也得以设定时间距离,让它自动播放。
又ViewAnimator继承至于FrameLayout的,所以ViewFilpper的Layout里面能够停放多少个View,继承关系如下:
图片 1
本示例通过ViewFlipper和GestureDetector.OnGestureListener达成自动播放和手势滑屏事件,先看效果:
图片 2
Activity
01.import
android.app.Activity;
02.import android.os.Bundle;
03.import
android.view.GestureDetector;
04.import
android.view.MotionEvent;
05.import
android.view.ViewGroup.LayoutParams;
06.import
android.view.animation.Animation;
07.import
android.view.animation.AnimationUtils;
08.import
android.widget.ImageView;
09.import
android.widget.ViewFlipper;

  1. 11.public class ViewFlipperActivity
    extends Activity implements
    android.view.GestureDetector.OnGestureListener
    {
  2. private int[] imgs = { R.drawable.img1, R.drawable.img2,
  3. R.drawable.img3, R.drawable.img4, R.drawable.img5 };
  4. private
    GestureDetector gestureDetector = null;
  5. private ViewFlipper viewFlipper =
    null;
  6. private Activity mActivity = null;
  7. @Override
  8. public void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11. mActivity = this;
  12. viewFlipper = (ViewFlipper) findViewById(R.id.viewflipper);
  13. gestureDetector = new GestureDetector(this); // 证明检查和测试手势事件
  14. for (int
    i = 0; i 120) { // 从左向右滑动(左进右出)
  15. Animation rInAnim =
    AnimationUtils.loadAnimation(mActivity, R.anim.push_right_in); //
    向右滑动左边进入的渐变效果(阿尔法 0.1 -> 1.0)
  16. Animation rOutAnim =
    AnimationUtils.loadAnimation(mActivity, R.anim.push_right_out); //
    向右滑动左侧滑出的渐变效果(阿尔法 1.0 -> 0.1)
  17. viewFlipper.setInAnimation(rInAnim);
  18. viewFlipper.setOutAnimation(rOutAnim);
  19. viewFlipper.showPrevious();
  20. return true;
  21. } else if (e2.getX() – e1.getX() 1.0)
  22. Animation
    lOutAnim = AnimationUtils.loadAnimation(mActivity,
    R.anim.push_left_out); //
    向左滑动左侧滑出的渐变效果(阿尔法 1.0 -> 0.1)
  23. viewFlipper.setInAnimation(lInAnim);
  24. viewFlipper.setOutAnimation(lOutAnim);
  25. viewFlipper.showNext();
  26. return true;
  27. }
  28. return true;
  29. }
  30. @Override
  31. public boolean onDown(MotionEvent e) {
  32. return
    false;
  33. }
  34. @Override
  35. public void
    onLongPress(MotionEvent e) {
  36. }
  37. @Override
  38. public
    boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
    float
    distanceY) {
  39. return false;
  40. }
  41. @Override
  42. public
    void onShowPress(MotionEvent e) {
  43. }
  44. @Override
  45. public
    boolean onSingleTapUp(MotionEvent e) {
  46. return false;
  47. }
    95.}
    main.xml
    图片 3

 

以身作则分析

 

一 、自动播放

 

ViewFlipper控件,是ImageView的器皿,用于添加显示的图纸能源,首要成效有四个:添加彰显View和自动播放View

 

透过兑现父类android.view.ViewGroup的addView(View child,
ViewGroup.LayoutParams
params)添加View资源,即图片和填充样式

 

启航自动播放View,能够经过设置如下八个分子函数完结:

 

1、setAutoStart(true),设置是或不是自动播放效能,true为自动播放,false为不自动播放,开启自动播放设为true

 

② 、 setFlipInterval(int
milliseconds),设置View播放的时间间隔,如两千(3秒)

 

三 、 startFlipping(),初始自动播放

 

停下自动播放View,设置成员函数如下:

 

① 、 stopFlipping(),停止自动播放

 

② 、 setAutoStart(false),停止自动播放,设为false

 

二 、手势滑屏

 

手势滑动荧屏动画,是因而android.view.GestureDetector类检查和测试各个手势事件实现的,该类有多个回调接口(Interface)

 

A、GestureDetector.OnDoubleTapListener,用来通告DoubleTap双击事件,类似于鼠标的双击事件,接口八个抽象回调函数如下

 

① 、onDoubleTap(Motion伊夫nt e):DoubleTap双击手势事件后布告(触发)

 

2、onDoubleTapEvent(MotionEvent
e):DoubleTap双击掌势事件之间打招呼(触发),包罗down、up和move事件(那里指的是在双击之间产生的事件,例如在同二个地点双击会时有产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,那七个事件由该函数通告)

 

3、onSingleTapConfirmed(MotionEvent
e):用来判定该次点击是SingleTap而不是DoubleTap,即便连接点击两回就是DoubleTap手势;那么只要只点击一回,系统等待一段时间后尚未收受第三遍点击则判定该次点击为SingleTap而不是DoubleTap,此时触及的就是SingleTapConfirmed事件

 

B、GestureDetector.OnGestureListener,用来文告普通的手势事件(down、longPress、scroll、up等),接口具体的几个抽象回调函数如下

 

一 、onDown(Motion伊夫nt e):down事件,表示按下事件

 

② 、onSingleTapUp(Motion伊芙nt e):二回点击up事件,表示按下后的抬起风浪

 

3、onShowPress(MotionEvent
e):down事件产生而move或则up还没产生前触发该事件,此事件一般用来公告用户press按击事件已发出

 

4、onLongPress(MotionEvent
e):长按事件,down事件后up事件前的一段时间间隔后(由系统一分配配,也可自定义),假设如故按住荧屏则正是长按事件

 

5、onFling(MotionEvent e1, MotionEvent e2, float velocityX, float
velocityY):滑入手势事件,例如scroll事件后突然up,fling的进程大小由e每秒x和y改变大小决定

 

6、onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float
distanceY):在显示器上拖动事件,即down按下点——scroll拖动——up抬源点的move移动事件

 

本示例的滑动显示器动画,仅使用了上边的GestureDetector.OnGestureListener及其onFling事件,具体达成步骤如下:

 

1、Activity实现android.view.GestureDetector.OnGestureListener
监听接口,并声称gestureDetector = new GestureDetector(this);
用于监听手势事件

 

贰 、在Activity的分子函数onTouch伊夫nt(Motion伊夫nt
event)中,注册GestureDetector.OnGestureListener手势监听的gestureDetector.onTouch伊夫nt(event);事件接口

 

三 、在GestureDetector.OnGestureListener回调函数onFling(Motion伊芙nt e1,
Motion伊芙nt
e2, float velocityX, float velocityY) 中,完成滑屏动画

 

③ 、荧屏渐变效果

 

壹 、 当手势从左向右滑动时,图片是左进右出

 

if (e2.getX() – e1.getX() > 120)
,即up终点(e2)与down起源(e1)的滑行距离当先120,来检查和测试从左向右滑动事件

 

push_left_in.xml —— 左进渐变效果
图片 4
push_left_out.xml ——
右出渐变效果
图片 5
2、
当手势从右向左滑动时,图片是右进左出
if (e2.getX() – e1.getX() < -120)
,即up终点(e2)与down起源(e1)的滑动距离小于-120,来检查和测试从右向左滑动事件

 

push_right_in.xml —— 右进渐变效果
图片 6
push_right_out.xml ——
右出渐变效果
图片 7
其间,android:duration表示渐变持续时间;translate表示位移变换;alpha表示反射率变换

 

translate

 

android:fromXDelta=”-百分百p” android:toXDelta=”0″
表示图片从左进入,从不足见到可知

 

android:fromXDelta=”0″ android:toXDelta=”100%p”
表示图片从右滑出,从可观望不可知

 

alpha

 

android:fromAlpha=”1.0″ android:toAlpha=”0.1″
表示图片并未透明(1.0)到透明(0.1)

 

android:fromAlpha=”0.1″ android:toAlpha=”1.0″
表示图片从透明(0.1)到不透明(1.0)

 

翻开ViewAnimator类的源码能够看看此类的功力至关心器重借使为内部的View切换提供动画效果。该类有如下几个和卡通相关的不二法门。

     2.PageFlipper结合手势翻页+特效;

setInAnimation:设置View进入显示器时候利用的卡通片。该方法有八个重载方法,即能够平素传入Animation对象,也得以流传定义的Animation文件的resourceID。

     3.WindowManager的着力用法。

setOutAnimation:设置View退出显示器时候利用的卡通片。使用情势和setInAnimation方法同样。

随便张图纸完毕循环滑动,其实PageFlipper当前最多的子View个数(ChildViewCount)小于等于2.

showNext:调用该情势能够浮现FrameLayout里面包车型大巴下1个View。

 

showPrevious:调用该措施能够来呈现FrameLayout里面包车型地铁上2个View。

 fliper_item.xml:

翻开ViewFlipper的源码能够见到,ViewFlipper主要用以完结View的自发性切换。该类提供了如下多少个关键的措施。

[java] 
<?xml version=”1.0″ encoding=”utf-8″?> 
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android” 
    android:layout_width=”match_parent” 
    android:layout_height=”match_parent” 
    android:gravity=”center” > 
 
    <ImageView 
        android:id=”@+id/img” 
        android:layout_width=”wrap_content” 
        android:layout_height=”wrap_content” 
        android:gravity=”center” /> 
 
</LinearLayout> 

setFilpInterval:安装View切换的小时间隔。参数为皮秒。

main.xml:

startFlipping:发端进行View的切换,时间距离是上述方式设置的间隔数。切换会循环举办。

[java] 
<?xml version=”1.0″ encoding=”utf-8″?> 
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android” 
    android:layout_width=”fill_parent” 
    android:layout_height=”fill_parent” 
    android:orientation=”vertical” > 
 
    <ViewFlipper 
        android:id=”@+id/myViewFlipper” 
        android:layout_width=”fill_parent” 
        android:layout_height=”fill_parent” > 
         
    </ViewFlipper> 
 
</LinearLayout> 

stopFlipping:停止View切换。

MainActivity.java:

setAutoStart:安装是或不是自动初始。假使设置为“true”,当ViewFlipper展现的时候View的切换会自动开端。

[java]
package com.xyz.pagefilter; 
 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.PixelFormat; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.GestureDetector; 
import android.view.GestureDetector.OnGestureListener; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.Window; 
import android.view.WindowManager; 
import android.view.WindowManager.LayoutParams; 
import android.widget.ImageView; 
import android.widget.ViewFlipper; 
 
public class MainActivity extends Activity implements
OnTouchListener, 
        OnGestureListener { 
 
    private LayoutInflater mInflater; 
    private WindowManager wm = null; 
    private WindowManager.LayoutParams wmParams = null; 
 
    private ImageView leftbtn = null; 
    private ImageView rightbtn = null; 
 
    private int mAlpha = 0; 
    private boolean isHide; 
 
    private int mCurrPos = 0; 
 
    private ViewFlipper viewFlipper = null; 
    private GestureDetector mGestureDetector; 
 
    private int[] mImages = new int[] { R.drawable.img_0,
R.drawable.img_1, 
            R.drawable.img_2, R.drawable.img_3, R.drawable.img_4, 
            R.drawable.img_5, R.drawable.img_6, R.drawable.img_7, 
            R.drawable.img_8, R.drawable.img_9 }; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        requestWindowFeature(Window.FEATURE_NO_TITLE); 
        setContentView(R.layout.main); 
 
        mInflater = (LayoutInflater)
getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        viewFlipper = (ViewFlipper)
this.findViewById(R.id.myViewFlipper); 
        setView(mCurrPos, 0); 
        initFloatView(); 
 
        // viewFlipper.setLongClickable(true); 
        viewFlipper.setOnTouchListener(this); 
        mGestureDetector = new GestureDetector(this); 
 
    } 
 
    private void initFloatView() { 
        wm = (WindowManager)
getApplicationContext().getSystemService( 
                Context.WINDOW_SERVICE); 
        wmParams = new WindowManager.LayoutParams(); 
 
        wmParams.type = LayoutParams.TYPE_PHONE;  
        wmParams.format = PixelFormat.RGBA_8888;  
         
        wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL 
                | LayoutParams.FLAG_NOT_FOCUSABLE; 
 
        wmParams.x = 0; 
        wmParams.y = 0; 
 
        wmParams.width = 50; 
        wmParams.height = 50; 
 
        createLeftFloatView(); 
        createRightFloatView(); 
    } 
 
    private void createLeftFloatView() { 
        leftbtn = new ImageView(this); 
        leftbtn.setImageResource(R.drawable.prev); 
        leftbtn.setAlpha(0); 
        leftbtn.setOnClickListener(new View.OnClickListener() { 
            public void onClick(View arg0) { 
                movePrevious(); 
            } 
        }); 
         
        wmParams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; 
         
        wm.addView(leftbtn, wmParams); 
    } 
 
    private void createRightFloatView() { 
        rightbtn = new ImageView(this); 
        rightbtn.setImageResource(R.drawable.next); 
        rightbtn.setAlpha(0); 
        rightbtn.setOnClickListener(new View.OnClickListener() { 
            public void onClick(View arg0) { 
                moveNext(); 
            } 
        }); 
         
        wmParams.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL; 
         
        wm.addView(rightbtn, wmParams); 
    } 
 
    private void setView(int curr, int next) { 
        View v = (View) mInflater.inflate(R.layout.flipper_item,
null); 
        ImageView iv = (ImageView) v.findViewById(R.id.img); 
        // iv.setScaleType(ImageView.ScaleType.FIT_XY); 
        if (curr < next && next > mImages.length – 1) 
            next = 0; 
        else if (curr > next && next < 0) 
            next = mImages.length – 1; 
        iv.setImageResource(mImages[next]); 
        if (viewFlipper.getChildCount() > 1) { 
            viewFlipper.removeViewAt(0); 
        } 
        viewFlipper.addView(v, viewFlipper.getChildCount()); 
        mCurrPos = next; 
 
    } 
 
    private void movePrevious() { 
        setView(mCurrPos, mCurrPos – 1); 
        viewFlipper.setInAnimation(MainActivity.this,
R.anim.in_leftright); 
        viewFlipper.setOutAnimation(MainActivity.this,
R.anim.out_leftright); 
        viewFlipper.showPrevious(); 
    } 
 
    private void moveNext() { 
        setView(mCurrPos, mCurrPos + 1); 
        viewFlipper.setInAnimation(MainActivity.this,
R.anim.in_rightleft); 
        viewFlipper.setOutAnimation(MainActivity.this,
R.anim.out_rightleft); 
        viewFlipper.showNext(); 
    } 
 
    private Handler mHandler = new Handler() { 
        public void handleMessage(Message msg) { 
            if (msg.what == 1 && mAlpha < 255) { 
                mAlpha += 50; 
                if (mAlpha > 255) 
                    mAlpha = 255; 
                leftbtn.setAlpha(mAlpha); 
                leftbtn.invalidate(); 
                rightbtn.setAlpha(mAlpha); 
                rightbtn.invalidate(); 
                if (!isHide && mAlpha < 255) 
                    mHandler.sendEmptyMessageDelayed(1, 100); 
            } else if (msg.what == 0 && mAlpha > 0) { 
                mAlpha -= 10; 
                if (mAlpha < 0) 
                    mAlpha = 0; 
                leftbtn.setAlpha(mAlpha); 
                leftbtn.invalidate(); 
                rightbtn.setAlpha(mAlpha); 
                rightbtn.invalidate(); 
                if (isHide && mAlpha > 0) 
                    mHandler.sendEmptyMessageDelayed(0, 100); 
            } 
        } 
    }; 
 
    private void showFloatView() { 
        isHide = false; 
        mHandler.sendEmptyMessage(1); 
    } 
 
    private void hideFloatView() { 
        new Thread() { 
            public void run() { 
                try { 
                    Thread.sleep(1500); 
                    isHide = true; 
                    mHandler.sendEmptyMessage(0); 
                } catch (Exception e) { 
                } 
            } 
        }.start(); 
    } 
 
    @Override 
    public void onDestroy() { 
        super.onDestroy(); 
        wm.removeView(leftbtn); 
        wm.removeView(rightbtn); 
    } 
 
    @Override 
    public boolean onDown(MotionEvent e) { 
        return false; 
    } 
 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float
velocityX, 
            float velocityY) { 
        int x = (int) (e2.getX() – e1.getX()); 
        if (x > 0) { 
            movePrevious(); 
        } else { 
            moveNext(); 
        } 
        return false; 
    } 
 
    @Override 
    public void onLongPress(MotionEvent e) { 
 
    } 
 
    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float
distanceX, 
            float distanceY) { 
        return false; 
    } 
 
    @Override 
    public void onShowPress(MotionEvent e) { 
        //
用户轻触荧屏,尚末松手或拖动,注意,强调的是没有没有松手大概拖动状态 
    } 
 
    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
        return false; 
    } 
 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
        switch (event.getAction()) { 
        case MotionEvent.ACTION_MOVE: 
        case MotionEvent.ACTION_DOWN: 
            showFloatView(); 
            break; 
        case MotionEvent.ACTION_UP: 
            hideFloatView(); 
            break; 
        } 
        mGestureDetector.onTouchEvent(event); 
        return true; 
    } 

诚如情况下,大家都会利用ViewFilpper类完毕View的切换,而不选择它的父类ViewAnimator类。

叠加特效文件:
in_leftright.xml:

2)实现滑动—GestureDetector介绍

[cpp] 
<?xml version=”1.0″ encoding=”utf-8″?> 
<set xmlns:android=”http://schemas.android.com/apk/res/android

 
    <translate 
        android:duration=”500″ 
        android:fromXDelta=”-100%p” 
        android:toXDelta=”0″ /> 
 
    <alpha 
        android:duration=”500″ 
        android:fromAlpha=”0.0″ 
        android:toAlpha=”1.0″ /> 
 
</set> 
in_rightleft.xml:

借使想要实现滑动翻页的效能,就要通晓别的二个类:android.view.GestureDetector类。GestureDetector类中能够用来检查和测试各个手势事件。该类有七个回调接口,分别用来文告具体的轩然大波。

[java]
<?xml version=”1.0″ encoding=”utf-8″?> 
<set xmlns:android=”http://schemas.android.com/apk/res/android

    <translate 
        android:duration=”500″ 
        android:fromXDelta=”100%p” 
        android:toXDelta=”0″ /> 
     
    <alpha 
        android:duration=”500″ 
        android:fromAlpha=”0.0″ 
        android:toAlpha=”1.0″ /> 
</set> 
out_leftright.xml:

GestureDetector.OnDoubleTapListener:用来通告DoubleTap事件,类似于PC下边包车型的士鼠标的双击事件。

[java] 
<?xml version=”1.0″ encoding=”utf-8″?> 
<set xmlns:android=”http://schemas.android.com/apk/res/android

    <translate 
        android:duration=”500″ 
        android:fromXDelta=”0″ 
        android:toXDelta=”100%p” /> 
     
    <alpha 
        android:duration=”500″ 
        android:fromAlpha=”1.0″ 
        android:toAlpha=”0.0″ /> 
</set> 
out_rightleft.xml:

GestureDetector.OnGestureListener:用来打招呼普通的手势事件,该接口有多个回调方法,具体的能够查阅API。那里想要达成滑动的判定,就必要用到里头的onFling()方法。

[java]
<?xml version=”1.0″ encoding=”utf-8″?> 
<set xmlns:android=”http://schemas.android.com/apk/res/android

 
    <translate 
        android:duration=”500″ 
        android:fromXDelta=”0″ 
        android:toXDelta=”-100%p” /> 
 
    <alpha 
        android:duration=”500″ 
        android:fromAlpha=”1.0″ 
        android:toAlpha=”0.0″ /> 
 
</set> 

3)具体的落到实处

http://www.bkjia.com/Javascript/505928.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javascript/505928.htmlTechArticle知识点: 1.PageFlipper中坚用法及动态增加View;
2.PageFlipper结合手势翻页+特效; 3.WindowManager的基本用法。
任意张图片完成循环滑动,其实P…

下边包车型大巴代码片段详细表明了什么贯彻滑动翻页。

复制代码 代码如下:

public class ViewFlipperActivity extends Activity implements
OnGestureListener { 

    private static final int FLING_MIN_DISTANCE = 100; 
    private ViewFlipper flipper; 
    private GestureDetector detector; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.viewflipper); 
        // 注册3个GestureDetector  
        detector = new GestureDetector(this); 
        flipper = (ViewFlipper) findViewById(R.id.ViewFlipper); 
        ImageView image1 = new ImageView(this); 
        image1.setBackgroundResource(R.drawable.image1); 
        // 扩充第二个view  
        flipper.addView(image1); 
        ImageView image2 = new ImageView(this); 
        image2.setBackgroundResource(R.drawable.image2); 
        // 扩张第一个view  
        flipper.addView(image2); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
        // 将触屏事件交给手势识别类处理  
        return this.detector.onTouchEvent(event); 
    } 

    @Override 
    public boolean onDown(MotionEvent e) { 
        return false; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) { 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
        return false; 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float
distanceX, 
            float distanceY) { 
        return false; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float
velocityX, 
            float velocityY) { 
        if (e1.getX() – e2.getX() > FLING_MIN_DISTANCE) { 
            //设置View进入和剥离的卡通效果  
           
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, 
                    R.anim.left_in)); 
           
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, 
                    R.anim.left_out)); 
            this.flipper.showNext(); 
            return true; 
        } 
        if (e1.getX() – e2.getX() < -FLING_MIN_DISTANCE) { 
           
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, 
                    R.anim.right_in)); 
           
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, 
                    R.anim.right_out)); 
            this.flipper.showPrevious(); 
            return true; 
        } 
        return false; 
    } 

在那段代码里,创设了五个IamgeView(用来呈现图片),到场到了ViewFlipper中。程序运转后,当用手指在荧屏上向左滑动,会体现前2个图片,用指尖在显示屏上向右滑动,会显得下三个图形。完成滑动切换的主要代码都在onFling()方法中,用户按下触摸屏,火速移动后放手,就会接触这么些事件。在那段代码示例中,对手指滑动的距离进行了计算,若是滑动距离超越100像素,就做切换动作,不然不做其余切换动作。

能够见见,onFling()方法有多少个参数,e1和e2上边代码应用了,比较好明白。参数velocityX和velocityY是做什么用的呢?velocityX和velocityY实际上是X轴和Y轴上的移位速度,单位是像素/秒。结合那多少个参数,能够断定滑动的快慢,从而做愈多的处理。

为了显得出滑动的成效,那里调用了ViewFlipper的setInAnimation()和setOutAnimation()方法设置了View进入和退出的动画片。对于动画的运用,这里不再赘述,也不再给出具体的XML文件代码了。

除此以外,在上边包车型大巴代码基础上说些额外的话题。

在Xml布局文件中,大家既能够安装像素px,也得以设置dp(或然dip)。

一般情状下,大家都会挑选选择dp,那样能够保障分歧荧屏分辨率的无绳电话机上布局一致。可是在代码中,一般是无能为力直接使用dp的。

拿地点的代码为例,代码中定义了滑动的距离阀值为100像素。那就会促成分裂分辨率的无绳电话机上效率有距离。比如在240X320的机型上,和在480X800的机型上,想要切换View,须求手指滑动的距离是例外的。所以,一般景况下,提议在代码中,也毫无用像素,也用dp。

那就是说既然不可能直接用dp,就要求从px转换到dp了。其实px和dp之间是有公式能够相互转换的。(基于Android中dp和px之间展开转移的贯彻代码)已经写过了,能够直接参考

你可能感兴趣的稿子: