您的位置:首页 > 移动开发 > Android开发

ViewPager与ViewFlipper实现图片导航的左右滑动

2017-09-27 22:06 609 查看

使用ViewPager和ViewFlipper实现图片导航的左右滑动

效果如下:



1.ViewFlipper控件,是ImageView的容器,用于添加显示的图片资源,主要功能有两个:添加显示View和自动播放View。

(1)ViewFlipperActivity

package com.example.navigationimgslide;

import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

/**
* @author zw
* @deprecated viewFlipper方式
*
*/

public class ViewFlipperActivity extends Activity implements View.OnTouchListener{

private MyViewFlipper viewFlipper;
private LinearLayout lvlayout;
private GestureDetector mDetector;//手势检测
private int[] str=new int[]{
R.drawable.image01,R.drawable.image02,
R.drawable.image03,R.drawable.image04};

private ImageView[] images;
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_viewflipper);
initView();

}
/**
* 初始化
*/
private void initView(){
viewFlipper= (MyViewFlipper) findViewById(R.id.viewFlipper);
lvlayout= (LinearLayout) findViewById(R.id.linear);
initData();

}

private void initData() {

images=new ImageView[str.length];
for (int i=1;i<=4;i++){
viewFlipper.addView(getImageView(str[i-1]));
img=new ImageView(this);
//
//默认选中第一张
if (i==1){
img.setImageResource(R.drawable.page);
}else{
img.setImageResource(R.drawable.page_now);
}

LinearLayout.LayoutParams params= new LinearLayout.LayoutParams( 20,20);
params.setMargins(10,0,10,0);
lvlayout.addView(img,params);
}

viewFlipper.setOnViewCountListener(new MyViewFlipper.OnViewCountListener() {
@Override
public void viewCount(int count) {

ImageView imgView=null;
for (int i=0;i<lvlayout.getChildCount();i++){
imgView= (ImageView) lvlayout.getChildAt(i);
//设置选中的
if (count==i){
imgView.setImageResource(R.drawable.page);
}else{
imgView.setImageResource(R.drawable.page_now);
}
}
}
});
viewFlipper.setOnTouchListener(this);

mDetector=new GestureDetector(new MyGesturListener());

}

private View getImageView(int id) {
ImageView image=new ImageView(this);
image.setScaleType(ImageView.ScaleType.FIT_XY);
image.setImageResource(id);
return image;
}

/**
* 触摸事件
* @param view
* @param motionEvent
* @return
*/
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
// 需要通过手势识别器 去识别触摸的动作
mDetector.onTouchEvent(motionEvent);
return true;
}

/**
* 手势识别的监听
*/
private class MyGesturListener implements GestureDetector.OnGestureListener {

final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;
@Override
public boolean onDown(MotionEvent motionEvent) {
Toast.makeText(ViewFlipperActivity.this,"onDown",Toast.LENGTH_SHORT).show();
return true;
}

@Override
public void onShowPress(MotionEvent motionEvent) {
Toast.makeText(ViewFlipperActivity.this,"onShowPress",Toast.LENGTH_SHORT).show();
}

@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
Toast.makeText(ViewFlipperActivity.this,"onSingleTapUp",Toast.LENGTH_SHORT).show();
return false;
}

@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1,
float v, float v1) {
Toast.makeText(ViewFlipperActivity.this,"onScroll",Toast.LENGTH_SHORT).show();
return false;
}

@Override
public void onLongPress(MotionEvent motionEvent) {
Toast.makeText(ViewFlipperActivity.this,"onLongPress",Toast.LENGTH_SHORT).show();
}

/**
* 手指滑动屏幕的时候 调用的方法
* @param e1 是第一触摸屏幕时候的事件
* @param e2 手指离开时候 的事件
* @param velocityX x方向的速度
* @param velocityY y方向的速度
* @return
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
Toast.makeText(ViewFlipperActivity.this,"onFling",Toast.LENGTH_SHORT).show();
//如果垂直方向移动的距离过大 就是无效的手势
if(Math.abs(e1.getY()-e2.getY()) >FLING_MIN_DISTANCE) {
return false;

}

//判断向右滑动屏幕的事件
if (e2.getX()-e1.getX()>100 && Math.abs(velocityX)> 100){

// 指定下一个view对象进来时候的动画效果
viewFlipper.setInAnimation(ViewFlipperActivity.this,R.anim.in_leftright);

//设置当前view对象出去时候的动画效果
viewFlipper.setOutAnimation(ViewFlipperActivity.this,R.anim.out_leftright);

//显示上一个内容
viewFlipper.showPrevious();
}

//判断向左滑动屏幕的事件
if (e1.getX()-e2.getX()>100 && Math.abs(velocityX)> 100){

// 指定下一个view对象进来时候的动画效果
viewFlipper.setInAnimation(ViewFlipperActivity.this,R.anim.in_rightleft);

//设置当前view对象出去时候的动画效果
viewFlipper.setOutAnimation(ViewFlipperActivity.this,R.anim.out_rightleft);

//显示下一个内容
viewFlipper.showNext();
}

return true;
}

}
}


(2)activity_viewFlipper.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="240dp"
>

<com.example.navigationimgslide.MyViewFlipper
android:id="@+id/viewFlipper"
android:layout_width="match_parent"
android:layout_height="240dp"
/>

<LinearLayout
android:id="@+id/linear"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:background="#4ccc"
android:layout_alignParentBottom="true"
android:orientation="horizontal" />

</RelativeLayout>


(3)左右滑动的动画

(3.1)向右滑动屏幕:进、出两个动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<translate
android:duration="2000"
android:fromXDelta="-100%p"
android:toXDelta="0"/>
</set>


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<translate
android:duration="2000"
android:fromXDelta="0"
android:toXDelta="100%p"/>
</set>


(3.2)向左滑动屏幕

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<translate
android:duration="2000"
android:fromXDelta="100%p"
android:toXDelta="0%p"/>
</set>


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<translate
android:duration="2000"
android:fromXDelta="0"
android:toXDelta="-100%p"/>
</set>



(4)自定义的ViewFlipper:myViewFlipper

package com.example.navigationimgslide;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ViewFlipper;

/**
* Created by zw
* 自定义的ViewFlipper
*/

public class MyViewFlipper extends ViewFlipper{

public MyViewFlipper(Context context) {
super(context);
}

public MyViewFlipper(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public void showNext() {
super.showNext();
//从继承关系中发现当子view变化的时候会调用该方法,因此在这里弄个回�?
mOnViewCountListener.viewCount(getDisplayedChild());
}

private OnViewCountListener mOnViewCountListener;

public void setOnViewCountListener(OnViewCountListener mOnViewCountListener) {
this.mOnViewCountListener = mOnViewCountListener;
}

public interface OnViewCountListener{
void viewCount(int count);
}
}


2.ViewPager实现左右滑动

(1)viewPagerActivity

package com.example.navigationimgslide;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

/**
* @author zw
* @deprecated viewpager的方式实现
*
*/

public class ViewPagerActivity extends Activity {

private ImageView imageView;
private ImageView[] imageViews;
private ViewPager viewPager;
private LinearLayout nvLayout;
private List<ImageView> views;

private int[] str=new int[]{
R.drawable.image01,R.drawable.image02,
R.drawable.image03,R.drawable.image04};

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

}

private void initView() {
viewPager = (ViewPager) findViewById(R.id.viewPager);
nvLayout = (LinearLayout) findViewById(R.id.viewPager_linear);
initData();
}

@SuppressLint("NewApi")
private void initData() {
imageViews=new ImageView[str.length];
views=new ArrayList<ImageView>();
ImageView imgV=null;

for (int i = 0; i < str.length; i++) {

imgV=new ImageView(this);
imgV.setScaleType(ScaleType.FIT_XY);
imgV.setImageResource(str[i]);
views.add(imgV);

ImageView dainImg=new ImageView(this);
if (i==0) {
dainImg.setImageResource(R.drawable.page);
}else{
dainImg.setImageResource(R.drawable.page_now);
}

LayoutParams layoutParams = new LayoutParams(
new LinearLayout.LayoutParams(20,
20));
layoutParams.setMargins(10, 0, 10, 0);
nvLayout.addView(dainImg, layoutParams);
}

//设置Adapter
viewPager.setAdapter(new MyPagerAdapter());
//设置监听,主要是设置点点的背景
viewPager.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
setImageBackground(arg0 % (str.length));
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub

}

@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub

}
});

}

/**
* 设置选中的的背景
* @param selectItems
*/
private void setImageBackground(int i) {
// TODO Auto-generated method stub
ImageView imageView=null;
for (int j = 0; j < str.length; j++) {
imageView=(ImageView) nvLayout.getChildAt(j);
if (i==j) {
imageView.setImageResource(R.drawable.page);
}else {
imageView.setImageResource(R.drawable.page_now);
}
}
}
class MyPagerAdapter extends PagerAdapter {

@Override
public int getCount() {
// TODO Auto-generated method stub
return views.size();
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}

@Override
public void destroyItem(View container, int position, Object object) {
// TODO Auto-generated method stub
((ViewPager) container).removeView(views.get(position));
}

/**
* 载入图片进去,用当前的position 除以 图片数组长度取余数是关键
*/
@Override
public Object instantiateItem(View container, int position) {
((ViewPager) container).addView(views.get(position));
return views.get(position);
}
}

}


(2)activity_pager

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="240dp"
>

<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="240dp"/>

<LinearLayout
android:id="@+id/viewPager_linear"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:background="#4ccc"
android:layout_alignParentBottom="true"
android:orientation="horizontal" />

</RelativeLayout>


参考文献:http://blog.csdn.net/zhangjinhuang/article/details/26287959

http://blog.csdn.net/chunqiuwei/article/details/50547290

源码下载:http://download.csdn.net/download/zhang106209/9998696

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息