android 自定义ViewPager

package com.rong.activity;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Scroller;

public class CustomViewPager extends ViewGroup {
	private Context mContext;
	private int screenWidth;
	private int screenHight;
	private int lastMoveX = 0;
	private VelocityTracker velocityTracker;
	private int MAX_VELOCITY=600;
	private int curScreen=0;
	private Scroller scroller;

	public CustomViewPager(Context context) {
		super(context);
		mContext = context;
		initView();
	}

	public CustomViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		initView();
	}

	public CustomViewPager(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mContext = context;
		initView();
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (velocityTracker == null) {
			velocityTracker = VelocityTracker.obtain();
		}
		velocityTracker.addMovement(event);

		int x = (int) event.getX();
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			lastMoveX = x;
			break;
		case MotionEvent.ACTION_MOVE:
			int dis = lastMoveX - x;
			scrollBy(dis, 0);
			lastMoveX = x;
			break;
		case MotionEvent.ACTION_UP:
			velocityTracker.computeCurrentVelocity(1000);
			int velocityX=(int)velocityTracker.getXVelocity();
			if(velocityX>MAX_VELOCITY&&curScreen>0){
				jump2Screen(curScreen-1);
			}else if(velocityX<-MAX_VELOCITY&&curScreen<getChildCount()-1){
				jump2Screen(curScreen+1);
			}else{
				int screen=(getScrollX()+screenWidth/2)/screenWidth;
				jump2Screen(screen);
			}

			if (velocityTracker != null) {
				velocityTracker.recycle();
				velocityTracker = null;
			}
			break;
		}
		return true;
	}

	/**
	 * 跳转到指定Screen
	 * @param screen
	 */
	public void jump2Screen(int screen){
		curScreen=screen;
		if(curScreen>getChildCount()-1){
			curScreen=getChildCount()-1;
		}
		int dis=curScreen*screenWidth-getScrollX();
		scroller.startScroll(getScrollX(), 0, dis, 0);
		invalidate();
	}

	@Override
	public void computeScroll() {
		if(scroller.computeScrollOffset()){
			scrollTo(scroller.getCurrX(), 0);
			postInvalidate();
		}
	}

	public void initView() {
		scroller=new Scroller(mContext);
		LinearLayout layout1 = new LinearLayout(getContext());
		layout1.setBackgroundColor(Color.RED);
		addView(layout1);
		LinearLayout layout2 = new LinearLayout(getContext());
		layout2.setBackgroundColor(Color.GREEN);
		addView(layout2);
		LinearLayout layout3 = new LinearLayout(getContext());
		layout3.setBackgroundColor(Color.BLUE);
		addView(layout3);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		screenWidth = MeasureSpec.getSize(widthMeasureSpec);
		screenHight = MeasureSpec.getSize(heightMeasureSpec);
		setMeasuredDimension(screenWidth, screenHight);
		for (int i = 0; i < getChildCount(); i++) {
			View view = getChildAt(i);
			view.measure(screenWidth, screenHight);
		}
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		int leftWidth = 0;
		for (int i = 0; i < getChildCount(); i++) {
			View view = getChildAt(i);
			view.layout(leftWidth, 0, leftWidth + screenWidth, screenHight);
			leftWidth = leftWidth + screenWidth;
		}
	}

}
时间: 2024-10-29 10:47:40

android 自定义ViewPager的相关文章

Android 自定义 ViewPager 打造千变万化的图片切换效果

Android 自定义 ViewPager 打造千变万化的图片切换效果 标签: Android自定义ViewPagerJazzyViewPager 目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记 得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开 始让ViewPager来做.时间长了,ViewPa

【转】android 自定义ViewPager,修改原动画

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记 得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开 始让ViewPager来做.时间长了,ViewPager的切换效果觉得枯燥,形成了审美疲劳~~我们需要改变,今天教大家如何改变ViewPager 切换时的效果,实现个性化的图片切换~~ 看一下这样效果的图片切换: 是

Android自定义ViewPager(一)——自定义Scroller模拟动画过程

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41575831 相信Android SDK提供的ViewPager组件,大家实在是熟悉不过了,但是ViewPager存在于support.v4包下的,说明ViewPager并不存在于早期的android版本中,那么如何在早期的android版本中也同样使用类似于ViewPager一样的滑动效果呢?这里,我们还是继续探讨一下andrid的自定义组件好了,并且这篇博文只探讨androi

android自定义ViewPager之——3D效果应用

今天在github里看到一个3D效果的ViewPager,感觉做出来的ViewPager滑动的时候效果十分的炫,就check out下来研究了一下如何实现的,以及如何使用,将整个ViewPager稍加修改后(主要是处理了一下与项目中其它控滑动控件的事件冲突)后,应用到了自己现在项目中.感觉这个效果真的非常的不错,现在把自己写的一个Demo分享出来. 下面是这个ViewPager嵌入到项目中的效果图: 修改以后,在切换ViewPager时会有立体感,会为自己的应用增色不少.下面把使用的Demo发出

Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38140505 自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScr

三行代码接入,社交软件打字时底下弹出的表情布局,自定义ViewPager+页面点标+各种功能的android小框架。

(转载请声明出处:http://www.cnblogs.com/linguanh/) 前言: 接上次分享的 ListView 动态加载类,入口:http://www.cnblogs.com/linguanh/p/4645115.html  这次分享给大家的是,刚些写好的类似社交软件打字时地下弹出的表情布局. 先看下我的默认效果图. 该效果图里面使用的图片资源,是默认的IC_lanucher,在我的类里面,你可以自定义,包括布局,几行几列,什么的,都可以自定义.底下的是小点标. 下集预告:我将在使

Android为ViewPager增加切换动画——自定义ViewPager

转载请注明出处:http://blog.csdn.net/allen315410/article/details/44224517 在上篇博客中,我写了一个使用属性动画为ViewPager添加切换动画的方法,并且可以兼容到Android3.0以下版本的设备上,那么关于为ViewPager添加动画的方式还会有另外一种实现方案,就是自定义一个自己带动画效果的ViewPager,关于上篇博客,还没来得及查看的朋友可以点击这里进行查看.下面,我们将新建一个工程,来说说怎样自定义一个自带切换动画效果的Vi

Android自定义组件系列【10】——随ViewPager滑动的导航条

昨天在用到ViewPager实现滑动导航的时候发现微信的导航条效果是跟随ViewPager的滑动而动的,刚开始想了一下,感觉可以使用动画实现,但是这个滑动是随手指时时变化的,貌似不可行,后来再网上搜了一下,找到一个开源代码,结果打开一看大吃一惊,这么简单的效果代码居然大概有300多行,太占手机存储空间了!后来自己干脆重写ViewGroup使用scrollTo方法实现了一下,具体实现过程如下: package com.example.slideupdownviewpage; import andr

Android实现图片轮显效果——自定义ViewPager控件

一.问题概述 使用ViewPager控件实现可横向翻页.水平切换图片等效果,但ViewPager需要手动滑动才能切换页面,图片轮显效果的效果本质上就是在ViewPager控件的基础上让它能自动的进行切换,所以实现图片轮显步骤如下: 1.  扩展ViewPager自定义一个MyScrollImageView类 2.  为MyScrollImageView定义适配器,装载图片信息 3.  定义图片滑动动画时间控制类 接下来我们就一步步实现下图案例: 二.实现套路 1.为自定义ViewPager控件编