先展示效果图:
自定义HorizontalScrollView类:AppHorizontalScrollView
package com.eg.lyx.demo;
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;
/***
* 应用详情页截图 自定义HorizontalScrollView视图 ( 仿ViewPager效果)
*
*/
public class AppHorizontalScrollView extends HorizontalScrollView {
/**
* 数据定义
*/
private int subChildCount = 0;
private ViewGroup firstChild = null;
private int downX = 0;
private int currentPage = 0;
private ArrayList<Integer> viewList = new ArrayList<Integer>();
/**
* 构造方法
*/
public AppHorizontalScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
init();
}
public AppHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public AppHorizontalScrollView(Context context) {
super(context);
init();
}
private void init() {
setHorizontalScrollBarEnabled(false);//设置原有的滚动无效
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
getChildInfo();
}
/**
* 获取子视图信息
*/
public void getChildInfo() {
firstChild = (ViewGroup) getChildAt(0);
if (firstChild != null) {
subChildCount = firstChild.getChildCount();
for (int i = 0; i < subChildCount; i++) {
if (((View) firstChild.getChildAt(i)).getWidth() > 0) {
viewList.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(viewList.get(currentPage)-10, 0);
}
/**
* 滑动到下一页
*/
private void smoothScrollToNextPage() {
if (currentPage < subChildCount - 1) {
currentPage++;
smoothScrollTo(viewList.get(currentPage)-10, 0);
}
}
/**
* 滑动到上一页
*/
private void smoothScrollToPrePage() {
if (currentPage > 0) {
currentPage--;
smoothScrollTo(viewList.get(currentPage)-10, 0);
}
}
/**
* 滑动到下一页
* @author caizhiming
*/
public void nextPage() {
smoothScrollToNextPage();
}
/**
* 滑动到上一页
*/
public void prePage() {
smoothScrollToPrePage();
}
/**
* 跳转到指定的页面
*/
public boolean gotoPage(int page) {
if (page > 0 && page < subChildCount - 1) {
smoothScrollTo(viewList.get(page), 0);
currentPage = page;
return true;
}
return false;
}
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.eg.lyx.demo.MainActivity">
<com.eg.lyx.demo.AppHorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="none"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<include layout="@layout/item_one"/>
<include layout="@layout/item_one"/>
<include layout="@layout/item_one"/>
<include layout="@layout/item_one"/>
</LinearLayout>
</com.eg.lyx.demo.AppHorizontalScrollView>
</RelativeLayout>
item_one:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="360dp"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"
android:background="@drawable/bg"
android:orientation="vertical"
android:paddingLeft="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="景点玩乐"
android:textColor="#99000000"
android:textStyle="bold"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginBottom="20dp"
android:layout_marginTop="20dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:scaleType="fitXY"
android:src="@drawable/aa"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="6dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="POI名称"
android:textSize="13sp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginBottom="4dp"
android:layout_marginTop="4dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="visible">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="4.9分"
android:textColor="#e69e0e"
android:textSize="11sp"/>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:layout_marginBottom="2dp"
android:layout_marginLeft="3dp"
android:layout_marginRight="3dp"
android:layout_marginTop="2dp"
android:background="#000000"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="距离市中心10.2km"
android:textSize="11sp"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="234起"
android:textColor="#e69e0e"
android:textSize="11sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
android:layout_marginRight="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#1c57c4"
android:text="预订"
android:textColor="#ffffff"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginBottom="20dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:scaleType="fitXY"
android:src="@drawable/aa"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="6dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="POI名称"
android:textSize="13sp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginBottom="4dp"
android:layout_marginTop="4dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="visible">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="4.9分"
android:textColor="#e69e0e"
android:textSize="11sp"/>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:layout_marginBottom="2dp"
android:layout_marginLeft="3dp"
android:layout_marginRight="3dp"
android:layout_marginTop="2dp"
android:background="#000000"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="距离市中心10.2km"
android:textSize="11sp"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="234起"
android:textColor="#e69e0e"
android:textSize="11sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
android:layout_marginRight="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#1c57c4"
android:text="预订"
android:textColor="#ffffff"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>