Android基于ImageSwitcher实现图片切换功能

左右切换图片控件大家都用ViewPager, ViewFipper比较多吧,我之前也用ViewPager实现了,使用ViewPager实现左右循环滑动图片,有兴趣的可以去看下,今天介绍的是基于ImageSwitcher实现的左右切换图片,先上截图吧

好了,接下来来看代码吧,第一张图是一个GridView,点击item跳转到第二个界面,第一个界面可以忽略,主要是讲解ImageSwitcher的左右却换图片,先看布局文件

<?xml version="1.0" encoding="UTF-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" >
  <ImageSwitcher
    android:id="@+id/imageSwitcher1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
  </ImageSwitcher> 

  <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <LinearLayout
      android:id="@+id/viewGroup"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_alignParentBottom="true"
      android:layout_marginBottom="30dp"
      android:gravity="center_horizontal"
      android:orientation="horizontal" >
    </LinearLayout>
  </RelativeLayout>
</FrameLayout>

然后就是Activity代码啦,总体来说比较简单,代码我添加了注释

package com.example.photoalbum; 

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.Toast;
import android.widget.ViewSwitcher.ViewFactory; 

public class ShowPhotoActivity extends Activity implements ViewFactory, OnTouchListener{
  /**
   * ImagaSwitcher 的引用
   */
  private ImageSwitcher mImageSwitcher;
  /**
   * 图片id数组
   */
  private int[] imgIds;
  /**
   * 当前选中的图片id序号
   */
  private int currentPosition;
  /**
   * 按下点的X坐标
   */
  private float downX;
  /**
   * 装载点点的容器
   */
  private LinearLayout linearLayout;
  /**
   * 点点数组
   */
  private ImageView[] tips; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.show_photo); 

    imgIds = new int[]{R.drawable.item01,R.drawable.item02,R.drawable.item03,R.drawable.item04,
        R.drawable.item05, R.drawable.item06, R.drawable.item07, R.drawable.item08,R.drawable.item09,
        R.drawable.item10, R.drawable.item11, R.drawable.item12};
    //实例化ImageSwitcher
    mImageSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitcher1);
    //设置Factory
    mImageSwitcher.setFactory(this);
    //设置OnTouchListener,我们通过Touch事件来切换图片
    mImageSwitcher.setOnTouchListener(this); 

    linearLayout = (LinearLayout) findViewById(R.id.viewGroup); 

    tips = new ImageView[imgIds.length];
    for(int i=0; i<imgIds.length; i++){
      ImageView mImageView = new ImageView(this);
      tips[i] = mImageView;
      LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
          LayoutParams.WRAP_CONTENT));
      layoutParams.rightMargin = 3;
      layoutParams.leftMargin = 3; 

      mImageView.setBackgroundResource(R.drawable.page_indicator_unfocused);
      linearLayout.addView(mImageView, layoutParams);
    } 

    //这个我是从上一个界面传过来的,上一个界面是一个GridView
    currentPosition = getIntent().getIntExtra("position", 0);
    mImageSwitcher.setImageResource(imgIds[currentPosition]); 

    setImageBackground(currentPosition); 

  } 

   /**
   * 设置选中的tip的背景
   * @param selectItems
   */
  private void setImageBackground(int selectItems){
    for(int i=0; i<tips.length; i++){
      if(i == selectItems){
        tips[i].setBackgroundResource(R.drawable.page_indicator_focused);
      }else{
        tips[i].setBackgroundResource(R.drawable.page_indicator_unfocused);
      }
    }
  }  

  @Override
  public View makeView() {
    final ImageView i = new ImageView(this);
    i.setBackgroundColor(0xff000000);
    i.setScaleType(ImageView.ScaleType.CENTER_CROP);
    i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    return i ;
  } 

  @Override
  public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:{
      //手指按下的X坐标
      downX = event.getX();
      break;
    }
    case MotionEvent.ACTION_UP:{
      float lastX = event.getX();
      //抬起的时候的X坐标大于按下的时候就显示上一张图片
      if(lastX > downX){
        if(currentPosition > 0){
          //设置动画,这里的动画比较简单,不明白的去网上看看相关内容
          mImageSwitcher.setInAnimation(AnimationUtils.loadAnimation(getApplication(), R.anim.left_in));
          mImageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(getApplication(), R.anim.right_out));
          currentPosition --;
          mImageSwitcher.setImageResource(imgIds[currentPosition % imgIds.length]);
          setImageBackground(currentPosition);
        }else{
          Toast.makeText(getApplication(), "已经是第一张", Toast.LENGTH_SHORT).show();
        }
      }  

      if(lastX < downX){
        if(currentPosition < imgIds.length - 1){
          mImageSwitcher.setInAnimation(AnimationUtils.loadAnimation(getApplication(), R.anim.right_in));
          mImageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(getApplication(), R.anim.lift_out));
          currentPosition ++ ;
          mImageSwitcher.setImageResource(imgIds[currentPosition]);
          setImageBackground(currentPosition);
        }else{
          Toast.makeText(getApplication(), "到了最后一张", Toast.LENGTH_SHORT).show();
        }
      }
      } 

      break;
    } 

    return true;
  } 

}

上面切换图片主要用到的就是动画了,用的是translate移动动画,这里我就不介绍了,接下来我吧动画代码贴出来,在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="500"/>
</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="500"/>
</set>

右边进入的动画,right_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="500"/>
</set>

右边出去的动画,right_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="500"/>
</set>

好了,介绍完了,代码写的不是很好,写的不好的地方希望大家谅解,小编一定更加努力。

(0)

相关推荐

  • Android中使用GridView和ImageViewSwitcher实现电子相册简单功能实例

    我们在手机上查看相册时,首先看到的是网格状的图片展示界面,然后我们选择想要欣赏的照片点击进入,这样就可以全屏观看该照片,并且可以通过左右滑动来切换照片.如下图的显示效果: 实现Activity之间的跳转以及照片标记位置的传递需要用到intent,并分别使用putExtra以及getExtra,传入和获取照片的标记位置. (关于intent,后期会有专门博文介绍具体使用,请大家持续关注哦) 下面我们开始功能的实现: 第一步:Layout中建立首页GridView布局grid_layout.xml文

  • Android UI控件Switch的使用方法

    在Android中偶尔会用到开关,Switch就是一个简单易使用的不错的控件. 首先,在布局中添加上Switch控件: <Switch android:id="@+id/s_v" android:layout_width="wrap_content" android:layout_height="wrap_content" android:switchMinWidth="20dp" android:textOn=&quo

  • Android UI设计系列之自定义SwitchButton开关实现类似IOS中UISwitch的动画效果(2)

    做IOS开发的都知道,IOS提供了一个具有动态开关效果的UISwitch组件,这个组件很好用效果相对来说也很绚丽,当我们去点击开关的时候有动画效果,但遗憾的是Android上并没有给我们提供类似的组件(听说在Android4.0的版本上提供了具有动态效果的开关组件,不过我还没有去看文档),如果我们想实现类似的效果那该怎么办了呢?看来又得去自定义了. 公司的产品最近一直在做升级,主要做的就是把界面做的更绚丽更美观给用户更好的体验(唉,顾客是上帝......),其中的设置功能中就有开关按钮,原来的开

  • Android控件ImageSwitcher实现左右图片切换功能

    ImageSwitcher类是ViewSwitcher类的子类,它实现的效果是在完成ImageView的切换并且带有动画效果.要使用这个类需要以下两个步骤: 1)为ImageSwitcher类提供一个ViewFactory,该ViewFactory生成的View组件必须是ImageView. 2)需要切换的时候,只需要嗲用ImageSwitcher的setImageDrawable().setImageResource().setImageURL()方法即可实现切换. activity_main

  • android基本控件ToggleButton&Switch使用指南

    ToggleButton(开关按钮)和Switch(开关)讲解: 一.核心属性讲解: (1)ToggleButton textOn:按钮被选中的时候文字显示 textOff:按钮没有被选中的时候文字显示 ToggleButton的状态只能是选中和未选中,并且需要为不同的状态设置不同的显示文本. 以下案例为ToggleButton的用法 目录结构 main.xml布局文件 <?xml version="1.0" encoding="utf-8"?> <

  • Android开发之ViewSwitcher用法实例

    本文实例讲述了Android开发之ViewSwitcher用法.分享给大家供大家参考,具体如下: android.widget.ViewSwitcher是ViewAnimator的子类,用于在两个View之间切换,但每次只能显示一个View. ViewSwitcher的addView函数的代码如下: /** * {@inheritDoc} * * @throws IllegalStateException if this switcher already contains two childre

  • Android入门之Gallery+ImageSwitcher用法实例解析

    继上一篇介绍了如何使用Gallery控件之后,本文就来讲一下Gallery 与ImageSwitcher的结合使用.本文所述实例代码将实现一个简单的浏览图片的功能. 先贴出程序运行截图如下: 除了Gallery可以拖拉切换图片,我在ImageSwitcher控件加入了setOnTouchListener事件实现,使得ImageSwitcher也可以在拖拉中切换图片.本例子依然使用JAVA的反射机制来自动读取资源中的图片. main.xml的源码如下: <?xml version="1.0&

  • 很赞的引导界面效果Android控件ImageSwitcher实现

    本文实例为大家分享了Android控件ImageSwitcher实现引导界面的代码,供大家参考,具体内容如下 效果图: 布局代码: <?xml version="1.0" encoding="UTF-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent&

  • android开发教程之switch控件使用示例

    复制代码 代码如下: <Switchandroid:id="@+id/open"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textOff="蓝牙关闭中"android:textOn="蓝牙开启中" /> 复制代码 代码如下: open.setOnCheckedChangeListe

  • Android使用gallery和imageSwitch制作可左右循环滑动的图片浏览器

    效果图: 为了使图片浏览器左右无限循环滑动 我们要自定义gallery的adapter 如果要想自定义adapter首先要了解这几个方法 @Override public int getCount() { // TODO Auto-generated method stub return 0; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @O

随机推荐