Android提供的ViewPager类太复杂,有时候没有必要使用,所以重写一个HorizontalScrollView来实现类似的效果,也可以当做Gallery来用

思路很简单,就是重写onTouchEvent事件,在手指抬起或者取消的时候,进行smoothScroll的操作,具体请看代码:

布局文件:activity_test.xml

 <?xml version="1.0" encoding="utf-8"?>
<com.example.testxinye.MyScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" > </LinearLayout>
</com.example.testxinye.MyScrollView>

Activity类:TestActivity.java

 package com.example.testxinye;

 import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
/**
*
* @author xinye
*
*/
public class TestActivity extends Activity {
private LinearLayout mContainer = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test); mContainer = (LinearLayout) findViewById(R.id.container); LayoutParams params = new LayoutParams(getWinWidth(), getWinHeight()); ImageView imageView1 = new ImageView(this);
imageView1.setLayoutParams(params);
imageView1.setImageResource(R.drawable.call_show_medal5);
imageView1.setScaleType(ScaleType.CENTER);
mContainer.addView(imageView1); ImageView imageView2 = new ImageView(this);
imageView2.setLayoutParams(params);
imageView2.setImageResource(R.drawable.call_show_medal1);
imageView2.setScaleType(ScaleType.CENTER);
imageView2.setBackgroundColor(Color.RED);
mContainer.addView(imageView2); ImageView imageView3 = new ImageView(this);
imageView3.setLayoutParams(params);
imageView3.setImageResource(R.drawable.call_show_medal2);
imageView3.setScaleType(ScaleType.CENTER);
imageView3.setBackgroundColor(Color.GRAY);
mContainer.addView(imageView3); ImageView imageView4 = new ImageView(this);
imageView4.setLayoutParams(params);
imageView4.setImageResource(R.drawable.call_show_medal3);
imageView4.setScaleType(ScaleType.CENTER);
imageView4.setBackgroundColor(Color.BLUE);
mContainer.addView(imageView4); ImageView imageView5 = new ImageView(this);
imageView5.setLayoutParams(params);
imageView5.setImageResource(R.drawable.call_show_medal4);
imageView5.setScaleType(ScaleType.CENTER);
imageView5.setBackgroundColor(Color.GREEN);
mContainer.addView(imageView5); } @Override
protected void onResume() {
// ((MyScrollView)mContainer.getParent()).init();
super.onResume();
} private int getWinWidth(){
DisplayMetrics dm = new DisplayMetrics();
//获取屏幕信息
getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}
private int getWinHeight(){
DisplayMetrics dm = new DisplayMetrics();
//获取屏幕信息
getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.heightPixels;
}
}

重写的HorizontalScrollView:MyScrollView.java

 package com.example.testxinye;

 import java.util.ArrayList;

 import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;
/**
*
* @author XINYE
*
*/
public class MyScrollView extends HorizontalScrollView {
private int subChildCount = 0;
private ViewGroup firstChild = null;
private int downX = 0;
private int currentPage = 0;
private ArrayList<Integer> pointList = new ArrayList<Integer>(); public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
} public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} public MyScrollView(Context context) {
super(context);
init();
}
private void init() {
setHorizontalScrollBarEnabled(false);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
receiveChildInfo();
}
public void receiveChildInfo() { firstChild = (ViewGroup) getChildAt(0);
if(firstChild != null){
subChildCount = firstChild.getChildCount();
for(int i = 0;i < subChildCount;i++){
if(((View)firstChild.getChildAt(i)).getWidth() > 0){
pointList.add(((View)firstChild.getChildAt(i)).getLeft());
}
}
} }
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) ev.getX();
break;
case MotionEvent.ACTION_MOVE:{ }break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:{
if( Math.abs((ev.getX() - downX)) > getWidth() / 4){
if(ev.getX() - downX > 0){
smoothScrollToPrePage();
}else{
smoothScrollToNextPage();
}
}else{
smoothScrollToCurrent();
}
return true;
}
}
return super.onTouchEvent(ev);
} private void smoothScrollToCurrent() {
smoothScrollTo(pointList.get(currentPage), 0);
} private void smoothScrollToNextPage() {
if(currentPage < subChildCount - 1){
currentPage++;
smoothScrollTo(pointList.get(currentPage), 0);
}
} private void smoothScrollToPrePage() {
if(currentPage > 0){
currentPage--;
smoothScrollTo(pointList.get(currentPage), 0);
}
}
/**
* 下一页
*/
public void nextPage(){
smoothScrollToNextPage();
}
/**
* 上一页
*/
public void prePage(){
smoothScrollToPrePage();
}
/**
* 跳转到指定的页面
* @param page
* @return
*/
public boolean gotoPage(int page){
if(page > 0 && page < subChildCount - 1){
smoothScrollTo(pointList.get(page), 0);
currentPage = page;
return true;
}
return false;
}
}

源代码:http://download.csdn.net/detail/wangwangheng/6537043

Android重写HorizontalScrollView仿ViewPager效果的更多相关文章

  1. Android重写HorizontalScrollView模仿ViewPager效果

    Android提供的ViewPager类太复杂,有时候没有必要使用,所以重写一个HorizontalScrollView来实现类似的效果,也可以当做Gallery来用 思路很简单,就是重写onTouc ...

  2. Android 自定义View修炼-自定义HorizontalScrollView视图实现仿ViewPager效果

    开发过程中,需要达到 HorizontalScrollView和ViewPager的效果,于是直接重写了HorizontalScrollView来达到实现ViewPager的效果. 实际效果图如下: ...

  3. 自定义控件(视图)2期笔记09:自定义视图之继承自ViewGroup(仿ViewPager效果案例)

    1. 这里我们继承已有ViewGroup实现自定义控件,模拟出来ViewPager的效果,如下: (1)实现的效果图如下: (2)实现步骤: • 自定义view继承viewGroup • 重写onLa ...

  4. android自定义控件(5)-实现ViewPager效果

    对于系统的ViewGroup我们已经是十分熟悉了,最常用的LinearLayout和RelativeLayout几乎是天天要打交道,下面我们就来看看,如何一步一步将其实现: 一.首先当然也是最通常的新 ...

  5. Android 使用HorizontalScrollView 实现Gallery效果

    Gallery(画廊)是一个锁定中心条目并且拥有水平滚动列表的视图,一般用来浏览图片,并且可以响应事件显示信息:Gallery还可以和ImageSwitcher组件结合使用来实现一个通过缩略图来浏览图 ...

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

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38140505 自从Gallery被谷歌废弃以后,Google推荐使用ViewPa ...

  7. Android控件-Fragment+ViewPager(高仿微信界面)

    什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个 ...

  8. Android中Fragment和ViewPager那点事儿(仿微信APP)

    在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...

  9. android 自定义scrollview 仿QQ空间效果 下拉伸缩顶部图片,上拉回弹 上拉滚动顶部title 颜色渐变

    首先要知道  自定义scrollview 仿QQ效果 下拉伸缩放大顶部图片 的原理是监听ontouch事件,在MotionEvent.ACTION_MOVE事件时候,使用不同倍数的系数,重置布局位置[ ...

随机推荐

  1. 中断描述符表(Interrupt Descriptor Table,IDT)

    中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组. #pr ...

  2. 如何使用sendEmail发送邮件

    sendEmail是一个轻量级,命令行的SMTP邮件客户端.如果你需要使用命令行发送邮件,那么sendEmail是非常完美的选择:使用简单并且功能强大.这个被设计用在php.bashperl和web站 ...

  3. Hbuilder开发app实战-识岁03-文件上传

    前言 做app不得不谈的问题就是文件上传.用hbuilder开发app让上传变的非常easy. Uploader Uploader模块管理网络上传任务,用于从本地上传各种文件到server,并支持跨域 ...

  4. 【linux】——ubuntu12.04 下安装wine和wine乱码解决方案

    ————————安装最新ppa的wine———————— sudo add-apt-repository ppa:ubuntu-wine/ppa sudo apt-get update sudo ap ...

  5. ES06--elasticsearch

    ES06--elasticsearch unassigned错误解决(手动处理)   查看集群健康状态:curl -XGET http://localhost:9200/_cluster/health ...

  6. tabs 标签样式

    http://www.jq22.com/jquery-info17973 http://www.jq22.com/demo/elementTab201801262311/ 插件描述:基于element ...

  7. ROS关于cv_brige的使用

    最近想使用OpenCV 和ROS实现点云的拼接,实现三维重建,那么在学习了kinect的基本的使用方法以后我们知道,直接使用ROS 的包即可得到点云,深度图,rgb图等信息, roslaunch op ...

  8. js学习(四)- prototype原型对象

    前言: 下面两行代码都是创建一个数组对象myArray:var myArray=[];//等价于var myArray=new Array();同样,下面的两段代码也都是创建一个函数myFunctio ...

  9. 遍历QMap引发异常处理

    引言 用常规方法遍历QMap,删除满足条件元素时出现“读取位置0xXXX时发生访问冲突”.查看“调用堆栈”指向QMap<int,int>::iterator::operator++()和Q ...

  10. Android pid uid

    PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统回收,可能会被继续分配给新运行的程序,但是在a ...