用户向导左右滑动页面实现之ImageSwitcher

当第一次打开一个app时,通常有一个使用向导介绍本APK的基本功能和使用方法,这个向导是非常重要的,方便用户能快速知道和适应该app怎样用。

实现此使用向导有很多种方法,比如用ImageSwitcher,ViewPager。当然要用ViewSwitcher或是ViewGroup去实现也是可以的,只不过有点大材小用了。

用ImageSwitcher和ViewPager的区别就在于ImageSwitcher能轻松地指定页面切换的动画!这里先总结下ImageSwitcher的实现。

首先,定义布局文件activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ImageSwitcher
        android:id="@+id/switcher"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        >
    </ImageSwitcher>
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/dots"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="50dp"
        android:gravity="center_horizontal"
        ></LinearLayout>
</RelativeLayout>

布局文件中有一个id为dots的LinearLayout就是一会儿可以切换显示的小圆点。

让你的Activity实现ViewFactory接口,做为imageSwitcher.setFactory的参数,小圆点的实现是根据可切换图片的张数动态添加到dots中的。具体的代码如下:

package com.example.imageswitcher;

import android.annotation.SuppressLint;
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.ViewSwitcher.ViewFactory;

public class MainActivity extends Activity implements  ViewFactory {

	private ImageSwitcher mSwitcher ;
	private LinearLayout mLinearLayout ;
	private ImageView[] mImageViewDots ;
	private int mIndex = 0 ;
	private int mImageRes[] = new int[]{
			R.drawable.a,
			R.drawable.b,
			R.drawable.c,
			R.drawable.d,
			R.drawable.e,
			R.drawable.g
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mLinearLayout = (LinearLayout)findViewById(R.id.dots);
		mSwitcher = (ImageSwitcher)findViewById(R.id.switcher);
		initDots();
		mSwitcher.setFactory(this);
		mSwitcher.setImageResource(mImageRes[0]);
		mImageViewDots[0].setBackgroundResource(R.drawable.dot_focus);
	}

	@SuppressLint("NewApi")
	public void initDots(){
		mLinearLayout.removeAllViews() ;
		mImageViewDots = new ImageView[mImageRes.length] ;
		for(int i=0 ;i<mImageRes.length ;i++){
			ImageView dot = new ImageView(this);
			dot.setBackgroundResource(R.drawable.dot_nomal);
			dot.setLayoutParams(new LayoutParams(30,30)) ;
			TextView tv = new TextView(this);
			tv.setLayoutParams(new LayoutParams(30,30));
			mImageViewDots[i] = dot ;
			mLinearLayout.addView(dot);
			mLinearLayout.addView(tv);
		}
	}

	@Override
	public View makeView() {
		return new ImageView(this);
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
			if(mIndex == 0){
				mIndex = mImageRes.length -1 ;
			}else{
				--mIndex ;
			}
			mSwitcher.setInAnimation(MainActivity.this, R.anim.left_in) ;
			mSwitcher.setOutAnimation(MainActivity.this, R.anim.right_out) ;
			mSwitcher.setImageResource(mImageRes[mIndex%mImageRes.length]);
		}else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
			if(mIndex == mImageRes.length - 1){
				mIndex = 0 ;
			}else{
				++mIndex ;
			}
			mSwitcher.setInAnimation(MainActivity.this, R.anim.rigth_in) ;
			mSwitcher.setOutAnimation(MainActivity.this, R.anim.left_out) ;
			mSwitcher.setImageResource(mImageRes[mIndex%mImageRes.length]);
		}
		for(int i=0 ;i<mImageViewDots.length ;i++){
			if(i == mIndex%mImageRes.length){
				mImageViewDots[i].setBackgroundResource(R.drawable.dot_focus);
			}else{
				mImageViewDots[i].setBackgroundResource(R.drawable.dot_nomal);
			}
		}
		return super.onKeyDown(keyCode, event);
	}
}

这里可切换的图片可随意制定。这里来说一下切换动画,这里总有4个动画,分为两组。第一组是当ImageSwitcher向左切换图片的时候,首先setInAnimation是设置即将出现的那张图片的动画,setOutAnimation是设置即将消息的那张图片的动画,分别是left_in,rigth_out。第二组则是与之相反的。四个动画分别如下(放在res/anim目录下):

left_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="-100%p"
        android:toXDelta="0"
        android:duration="1000" />
</set> 

rigth_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="0"
        android:toXDelta="100%p"
        android:duration="1000" />
</set> 

rigth_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="100%"
        android:toXDelta="0"
        android:duration="1000" />
</set> 

left_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="0"
        android:toXDelta="-100%p"
        android:duration="1000" />
</set>

针对小圆点,我是用drawable.xml文件去画的,在程序中可以指定它的大小。这里设置了两种颜色,用于区别当前在第几个页面。

dot_focus.xml

<?xml version="1.0" encoding="utf-8"?>
  <shape xmlns:android="http://schemas.android.com/apk/res/android"
      android:shape="oval"
      >
      <corners android:radius="5dip" />
      <solid android:color="#33FF00" />
</shape>

dot_nomal.xml

<?xml version="1.0" encoding="utf-8"?>
  <shape xmlns:android="http://schemas.android.com/apk/res/android"
      android:shape="oval"
      >
      <corners android:radius="5dip" />
      <solid android:color="#FFFF99" />
</shape>

我是在Android机顶盒上开发的此Demo,所有捕捉的是左键和右键。如果是手机端的话,可以捕捉手势。上一张大概的图:

接下来将用ViewPager实现此效果。

用户向导左右滑动页面实现之ImageSwitcher

时间: 2024-11-05 12:26:13

用户向导左右滑动页面实现之ImageSwitcher的相关文章

用户控件与页面间相互给各自的控件赋值

用户控件 ->页面 ((Label)this.Parent.Page.FindControl("AAA")).Text = "ABC"; AAA:页面控件ID Label:页面控件类型 页面 -> 用户控件 ((HiddenField)POPUSER_1.FindControl("hidNO")).Value = "VNBB"; POPUSER_1:用户控件ID HiddenField:用户控件中需要处理的控件的类

Android 实现用户列表信息滑动删除功能和选择删除功能

在项目开发过程中,常常需要对用户列表的信息进行删除的操作.Android中常用的删除操作方式有两种 ,一种就是类似微信的滑动出现删除按钮方式,还有一种是通过CheckBox进行选择,然后通过按钮进行删除的方式.本来的实例集成上述的两种操作方式来实现用户列表删除的效果. 设计思路:在适配器类MyAdapter一个滑动删除按钮显示或隐藏的Map,一个用于CheckBox是否选中的Map和一个与MainAcitivyt进行数据交互的接口ContentsDeleteListener,同时该接口包含两个方

android滑动页面

使用android-support-v4.jar里面的ViewPager实现滑动页面. 基本包含三个部分: 1. 导航控件 2. 游标(指示当前页面) 3. 一个ViewPager. 例子做的比较简单就几个控件换来换去的, 每个人的想法都不同相应的实现方法也就不一样呢,关键还是思想什么的. 所谓积少成多每天看一些小例子再用自己的思想 去实现一些小例子再记录下来很有帮助的. 源码下载: http://pan.baidu.com/s/1o6NpBtS android滑动页面,布布扣,bubuko.c

利用HTML5判断用户是否正在浏览页面技巧

现在,HTML5里页面可见性接口就提供给了程序员一个方法,让他们使用visibilitychange页面事件来判断当前页面可见性的状态,并针对性的执行某些任务.同时还有新的document.hidden属性可以使用. document.hidden 这个新出现的document.hidden属性,它显示页面是否为用户当前观看的页面,值为ture或false. document.visibilityState visibilityState的值要么是visible (表明页面为浏览器当前激活tab

左右滑动页面

#pragma mark- 滑动 @property (nonatomic, strong)UISwipeGestureRecognizer *leftSwipeGestureRecognizer; @property (nonatomic, strong)UISwipeGestureRecognizer *rightSwipeGestureRecognizer; #pragma mark- 初始化滑动页面 -(void)handleSwipesInit{ self.leftSwipeGestu

Android滑动页面导航效果: PagerSlidingTabStrip

把github上的PagerSlidingTabStrip稍作修改: tab的文字颜色选中变色(原版文字不变色) 栗子:http://download.csdn.net/detail/onlyonecoder/7722021 PagerSlidingTabStrip 自定义属性列表: pstsIndicatorColor Color of the sliding indicator pstsUnderlineColor Color of the full-width line on the bo

Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错GConf error

Linux 的 GConf error 解决办法 问题: Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错,导致重新进入Centos系统后出现: GConf error:Failed to contact configuration server;some possible cause are that you need to enable TCP/IP networking for ORBIT or you have stale NFSlocks due to a sys

Twitter Bootstrup风格jQuery用户向导插件

这是一款非常实用的基于Twitter Bootstrup的jQuery用户向导插件.该用户向导插件允许你使用按钮来在各个不同的操作步骤之间来回切换,还可以单独对某个步骤进行特殊的事件处理. 该插件依赖于: Bootstrap 3.x jQuery v1.3.2 + 在线演示:http://www.htmleaf.com/Demo/201502261424.html 下载地址:http://www.htmleaf.com/jQuery/Layout-Interface/201502261423.h

可能是滑动页面

就是,用手左右滑动页面 首先先在layout中配置好各个页面,我配置了新建的六个图片页面. 然后新建main.xml文件, <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent&qu