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. redis+nginx+tomcat故障大全

    tomcat+nginx+redis中 redis死掉了???确实是防火墙问题centos7用的firewalldfirewalld默认已经安装并启用了,如果需要nginx可以访问需要执行以下命令:# ...

  2. java进程的守护进程脚本

    当jar程序执行异常中断时,希望系统能够自动启动.通过以下shell脚本监控程序一直运行. #/bin/bash while true; do count=`ps -ef | grep test.ja ...

  3. Spring Cloud Config 配置中心

    请将远程配置文件的格式写对: 比如使用 *.yml 或者 *.properties yml: testconfig: testvalue properties: testconfig=testvalu ...

  4. JavaScript实现继承的混合方式

    实现JavaScript继承的最简单的方式是call方法(或者apply方法)及原型链方法,但这两种方法都有缺陷,而其混合体就是很好的继承实现方式.下面举例说明: function Animal(ag ...

  5. [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 数据在mysq和hdfs之间的相互转换

    P573 从mysql导入数据到hdfs 第一步:在mysql中创建待导入的数据 1.创建数据库并允许所有用户访问该数据库 mysql -h 192.168.200.250 -u root -p CR ...

  6. 解决Ajax跨域问题:Origin http://127.0.0.1:8080 is not allowed by Access-Control-Allow-Origin.

    在服务端上设置一下header,如response.header("Access-Control-Allow-Origin","*");

  7. python进行数据分析------相关分析

    相关分析 import statsmodels.api as sm import pandas as pd import numpy as np from patsy.highlevel import ...

  8. JDBC创建数据库实例

    在本教程将演示如何在JDBC应用程序中创建数据库. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式中创建数据库. 要执行以下示例,需要用实际用户名和密码替换这里用 ...

  9. JDBC简单示例代码

    本文章教程中将演示如何创建一个简单的JDBC应用程序的示例. 这将显示如何打开数据库连接,执行SQL查询并显示结果. 这个示例代码中涉及所有步骤,一些步骤将在本教程的后续章节中进行说明. 创建JDBC ...

  10. 利用smba实现windows上写程序,linux上运行

    1.在linux下载程序代码(确保获取正确的文件属性) 2.在windows编写代码,对于已有代码,不改变文件权限,如原先为755的,更改文件内容后依然是755的文件,如果要新建文件,默认为644,其 ...