Android实现左右滑动指引效果

  本文介绍Android中实现左右滑动的指引效果。

  关于左右滑动效果,我在以前的一篇博文中提到过,有兴趣的朋友可以查看:http://www.cnblogs.com/hanyonglu/archive/2012/02/13/2349827.html

  如果想实现带渐显按钮的左右滑动效果,请访问博文:http://www.cnblogs.com/hanyonglu/archive/2012/02/13/2350171.html

  本文的目的是要实现左右滑动的指引效果。那么什么是指引效果呢?现在的应用为了有更好的用户体验,一般会在应用开始显示一些指引帮助页面,使用户能更好的理解应用的功能,甚至是一些新闻阅读器会把一些头条新闻以指引效果的形式显示。说个最基本的,就是我们的手机主屏幕就是这种效果。

  下面我们就开始实现我们的左右滑动指引效果。为了大家更好的理解,我们先看下实现效果,如下图所示:

 

 

  在这里,我们需要用到google提到的一个包——android-support-v4.jar,这个包包含了一些非常有用的类,其中就是ViewPager类来实现页面之间的切换操作,关于android-support-v4.jar的详细信息,大家可以访问google官方网站:http://developer.android.com/sdk/compatibility-library.html

  首先我们先看下项目结构:

  

  在上图项目结构中,我们需要首先引入android-support-v4.jar包。下面让我们看一下代码实现。

  核心实现代码如下所示:

package com.test.guide;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;

/**
 * Android实现左右滑动指引效果
 * @Description: Android实现左右滑动指引效果

* @File: MyGuideViewActivity.java

* @Package com.test.guide

* @Author Hanyonglu

* @Date 2012-4-6 下午11:15:18

* @Version V1.0
 */
public class MyGuideViewActivity extends Activity {
     private ViewPager viewPager;  
     private ArrayList<View> pageViews;  
     private ImageView imageView;  
     private ImageView[] imageViews; 
     // 包裹滑动图片LinearLayout
     private ViewGroup main;
     // 包裹小圆点的LinearLayout
     private ViewGroup group;
        
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 设置无标题窗口
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        
        LayoutInflater inflater = getLayoutInflater();  
        pageViews = new ArrayList<View>();  
        pageViews.add(inflater.inflate(R.layout.item05, null));
        pageViews.add(inflater.inflate(R.layout.item06, null));
        pageViews.add(inflater.inflate(R.layout.item01, null));  
        pageViews.add(inflater.inflate(R.layout.item02, null));  
        pageViews.add(inflater.inflate(R.layout.item03, null));  
        pageViews.add(inflater.inflate(R.layout.item04, null));  
        
        imageViews = new ImageView[pageViews.size()];  
        main = (ViewGroup)inflater.inflate(R.layout.main, null);  
        
        group = (ViewGroup)main.findViewById(R.id.viewGroup);  
        viewPager = (ViewPager)main.findViewById(R.id.guidePages);  
        
        for (int i = 0; i < pageViews.size(); i++) {  
            imageView = new ImageView(MyGuideViewActivity.this);  
            imageView.setLayoutParams(new LayoutParams(20,20));  
            imageView.setPadding(20, 0, 20, 0);  
            imageViews[i] = imageView;  
            
            if (i == 0) {  
                //默认选中第一张图片
                imageViews[i].setBackgroundResource(R.drawable.page_indicator_focused);  
            } else {  
                imageViews[i].setBackgroundResource(R.drawable.page_indicator);  
            }  
            
            group.addView(imageViews[i]);  
        }  
        
        setContentView(main);
        
        viewPager.setAdapter(new GuidePageAdapter());  
        viewPager.setOnPageChangeListener(new GuidePageChangeListener());  
    }
    
    // 指引页面数据适配器
    class GuidePageAdapter extends PagerAdapter {  
        
        @Override  
        public int getCount() {  
            return pageViews.size();  
        }  
  
        @Override  
        public boolean isViewFromObject(View arg0, Object arg1) {  
            return arg0 == arg1;  
        }  
  
        @Override  
        public int getItemPosition(Object object) {  
            // TODO Auto-generated method stub  
            return super.getItemPosition(object);  
        }  
  
        @Override  
        public void destroyItem(View arg0, int arg1, Object arg2) {  
            // TODO Auto-generated method stub  
            ((ViewPager) arg0).removeView(pageViews.get(arg1));  
        }  
  
        @Override  
        public Object instantiateItem(View arg0, int arg1) {  
            // TODO Auto-generated method stub  
            ((ViewPager) arg0).addView(pageViews.get(arg1));  
            return pageViews.get(arg1);  
        }  
  
        @Override  
        public void restoreState(Parcelable arg0, ClassLoader arg1) {  
            // TODO Auto-generated method stub  
  
        }  
  
        @Override  
        public Parcelable saveState() {  
            // TODO Auto-generated method stub  
            return null;  
        }  
  
        @Override  
        public void startUpdate(View arg0) {  
            // TODO Auto-generated method stub  
  
        }  
  
        @Override  
        public void finishUpdate(View arg0) {  
            // TODO Auto-generated method stub  
  
        }  
    } 
    
    // 指引页面更改事件监听器
    class GuidePageChangeListener implements OnPageChangeListener {  
          
        @Override  
        public void onPageScrollStateChanged(int arg0) {  
            // TODO Auto-generated method stub  
  
        }  
  
        @Override  
        public void onPageScrolled(int arg0, float arg1, int arg2) {  
            // TODO Auto-generated method stub  
  
        }  
  
        @Override  
        public void onPageSelected(int arg0) {  
            for (int i = 0; i < imageViews.length; i++) {  
                imageViews[arg0].setBackgroundResource(R.drawable.page_indicator_focused);
                
                if (arg0 != i) {  
                    imageViews[i].setBackgroundResource(R.drawable.page_indicator);  
                }  
            }
        }  
    }

}

  在以前的示例中,我们实现左右滑动效果时通常使用ViewFlipper来实现,在这个示例中我使用的Google的android-support-v4.jar中的ViewPager类实现。在这里,我创建了6个页面布局,也就是6个页面之间的切换。首先需要把这个6个布局页面加入到集合中以方便操作,如下代码:

 LayoutInflater inflater = getLayoutInflater();
 pageViews = new ArrayList<View>();
 pageViews.add(inflater.inflate(R.layout.item05, null));
 pageViews.add(inflater.inflate(R.layout.item06, null));
 pageViews.add(inflater.inflate(R.layout.item01, null));
 pageViews.add(inflater.inflate(R.layout.item02, null));
 pageViews.add(inflater.inflate(R.layout.item03, null));
 pageViews.add(inflater.inflate(R.layout.item04, null));  

  有几个布局页面就有几个圆点图片,如下代码:

 imageViews = new ImageView[pageViews.size()];

  通过for循环设置圆点图片的布局,如下代码:

for (int i = 0; i < pageViews.size(); i++) {
            imageView = new ImageView(MyGuideViewActivity.this);
            imageView.setLayoutParams(new LayoutParams(20,20));
            imageView.setPadding(20, 0, 20, 0);
            imageViews[i] = imageView;  

            if (i == 0) {
                //默认选中第一张图片
                imageViews[i].setBackgroundResource(R.drawable.page_indicator_focused);
            } else {
                imageViews[i].setBackgroundResource(R.drawable.page_indicator);
            }  

            group.addView(imageViews[i]);
  } 

  然后再为ViewPager设置数据适配器和页面切换事件监听器,如下代码:

  viewPager.setAdapter(new GuidePageAdapter());
  viewPager.setOnPageChangeListener(new GuidePageChangeListener());

  

  在指引页面数据适配器中要在回调函数中控制好页面的初始化及销毁操作等,具体看上面的代码。

  在指引页面更改事件监听器(GuidePageChangeListener)中要确保在切换页面时下面的圆点图片也跟着改变,如下代码:

@Override
public void onPageSelected(int arg0) {
      for (int i = 0; i < imageViews.length; i++) {
           imageViews[arg0].setBackgroundResource(R.drawable.page_indicator_focused);

           if (arg0 != i) {
                imageViews[i].setBackgroundResource(R.drawable.page_indicator);
           }
       }
}

  下面是布局界面的代码,item.xml代码如下:

<?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" >

<LinearLayout
        android:id="@+id/linearLayout01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

</LinearLayout>    
    
    <LinearLayout
        android:id="@+id/linearLayout02"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:background="@drawable/divider_horizontal_line">
        
    </LinearLayout>
    
    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

<ImageView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/feature_guide_0" >
        </ImageView>
    </LinearLayout>

<LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="@drawable/bg" >
        
        <LinearLayout
            android:id="@+id/linearLayout2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_marginTop="30px"
            android:layout_marginBottom="30px"
            android:layout_marginLeft="30px"
            android:layout_marginRight="30px"
            android:background="@drawable/divider_horizontal_line" >
        </LinearLayout>

<LinearLayout
            android:id="@+id/linearLayout3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

<TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:paddingLeft="30px"
                android:paddingRight="30px"
                android:text="@string/text1" />
        
        </LinearLayout>
    
    </LinearLayout>

</LinearLayout>

  在最上方的导航是一个单独的布局,通过include标签引用。

<include android:id="@+id/item_header"
                layout="@layout/item_header" />

  说到这里了,有的朋友可能就要问了:你实现的效果很棒,那怎么样在界面上实现按钮或其它View的监听事件呢?对于这样一个问题,大家需要注意的是:不能直接使用findViewById()方法获取View。因为在加载布局界面时的代码是:

main = (ViewGroup)inflater.inflate(R.layout.main, null);
setContentView(main);

  而main.xml中没有我们设置的View,我们设置的View是在item01.xml或其它的布局中,所以应该使用如下代码设置view的监听事件:

View v1 = inflater.inflate(R.layout.item01, null);
tv1 = (TextView)v1.findViewById(R.id.textView1);
tv1.setOnClickListener(new TextView1OnClickListener());

  此处我是以TextView为例,所以应该使用如上方法监听相应的View事件,还有一点需要说明的是:需要将上方子界面添加到集合中代码修改,将如下代码

pageViews.add(inflater.inflate(R.layout.item01, null));  

  修改为如下:

View v1 = inflater.inflate(R.layout.item01, null);
pageViews.add(v1);  

  这样便可实现界面的上View的监听事件了。

  以上便是在Android中实现左右滑动指引效果的步骤,当然还可以使用其它的方法来实现这种效果,有兴趣的朋友可以去网上查找相关资料,这里不再详述。

  最后,希望转载的朋友能够尊重作者的劳动成果,加上转载地址:http://www.cnblogs.com/hanyonglu/archive/2012/04/07/2435589.html 谢谢。

  示例下载:点击下载

  带View的事件监听示例下载:点击下载

  完毕。^_^

时间: 2024-10-12 19:50:30

Android实现左右滑动指引效果的相关文章

Android实现左右滑动效果

本示例演示在Android中实现图片左右滑动效果.   关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现.接下来就让我们开始实现这种效果.为了方便大家理解,我们先来看一下效果图: 主要效果图如下图:    接下来我们看一下程序结构图: MainActivity文件中代码: package com.android.flip; import android.app.Activity; import android

android 使用viewflipper实现左右滑动的效果

public class MainActivity extends Activity implements OnGestureListener { private static final String TAG = "MainActivity"; private ViewFlipper viewFlipper; private GestureDetector detector; //手势检测 Animation leftInAnimation; Animation leftOutAni

Android Scroll分析——滑动效果产生

相对于在Android2.x版本上出现的长按.点击事件的效果,不得不说,滑动操作具有更好的用户体验.因此,从Android 4.X版本开始,出现了更多滑动操作的效果.越来越多第三方应用模仿这样的效果,来改善自己的应用.本文,我们刨根问底来探寻滑动效果的产生. 滑动效果如何产生 滑动一个View,其本质就是移动一个View.便是改变它的坐标位置,它的原理与动画产生的效果原理应该是如出一辙的.其最终本质都是改变其坐标.所以,我们要实现View滑动的效果,就只需要监听用户的触摸事件,动态改变View的

Android实现滑动刻度尺效果,选择身高体重和生日

刻度尺效果虽然看起来很美,我个人认为很不实用,即使再不实用,也有用的,鉴于群里成员对我的苦苦哀求,我就分享一个他用不到的,横屏滑动刻度尺,因为他需要竖屏的,哈哈…… 最近群里的开发人员咨询怎样实现刻度尺的滑动效果去选择身高体重等信息.我倒是做过这种效果,貌似群里要的那个开发者要竖着的刻度尺,那我就先分享个横着的刻度尺滑动选择效果.哈哈……我就是这么贱,贱贱的才惹人爱嘛!好了,不逗了,先给个横着的效果,自己试着去改编或者修改一下,看看通过自己的能力能不能做出竖着的效果来,过两天我再把竖着的那个滑动

Android UI效果实现——Activity滑动退出效果

更新说明: 1.在QQ网友北京-旭的提醒下,在SlideFrame的initilize方法中添加了focusable.focusableInTouch.clickable的状态设置,否则会导致部分情况下无法滑动,感谢! 一.使用说明 使用方法很简单,只有一个类HorizontalActivity,继承自FragmentActivity类,实现了contentView的滑动事件触发和动画效果,要在自己的代码里实现,方法两种: 1.如果对Activity没特殊要求,直接继承HorizontalAct

android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明

涉及到滑动,就涉及到VIEW,大家都知道,android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类,ViewGroup作为各个组件的容器搭建了整体的UI.以下是android UI的结构示示意图: 查看源码 /** * Implement this to do your drawing. * * @param canvas the canvas on which the background w

高仿微信对话列表滑动删除效果(转)

前言 用过微信的都知道,微信对话列表滑动删除效果是很不错的,这个效果我们也可以有.思路其实很简单,弄个ListView,然后里面的每个item做成一个可以滑动的自定义控件即可.由于ListView是上下滑动而item是左右滑动,因此会有滑动冲突,也许你需要了解下android中点击事件的派发流程,请参考Android源码分析-点击事件派发机制.我的解决思路是这样的:重写ListView的onInterceptTouchEvent方法,在move的时候做判断,如果是左右滑动就返回false,否则返

Android 背景可滑动登录界面 「 实现不压缩背景弹出键盘 」

Android 背景可滑动登录界面 废话不多说,先看下实现后的效果: 实现思路 看到上边 gif 图的效果,主要列举一下实现过程过程中遇到的难点. 如何使键盘弹出时候不遮挡底部登录布局: 当键盘弹出的时候如何不压缩背景图片或者背景延伸至「屏幕以外」: 从 「 windowSoftInputMode 」 说起 相信大家都清楚,Google 官方提供给开发者控制软键盘显示隐藏的方法不多,「windowSoftInputMode」算是我们可控制的软键盘弹出模式的方法之一.关于其属性的说明Google

【转】高仿微信对话列表滑动删除效果--不错

原文网址:http://blog.csdn.net/singwhatiwanna/article/details/17515543 转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17515543 前言 用过微信的都知道,微信对话列表滑动删除效果是很不错的,这个效果我们也可以有.思路其实很简单,弄个ListView,然后里面的每个item做成一个可以滑动的自定义控件即可.由于ListView是上下滑动而item是左右滑动,因