`

过期Gallery取代方案horizontalscrollView之京东效果

阅读更多

效果

-------------------------------------------------------------------------------------

素材

-------------------------------------------------------------------------------------

activity_main.xml

-------------------------------------------------------------------------------------

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/RelativeLayout1"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

 

    <HorizontalScrollView

        android:id="@+id/hsv"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_alignParentTop="true"

        android:layout_centerHorizontal="true"

        android:layout_gravity="center"

        android:spacing="0dp"  android:scrollbars="none">

 

        <com.horizontalscrollView03.MyGallery

            android:id="@+id/gallery"

            android:layout_width="wrap_content"

            android:layout_height="match_parent"

            android:orientation="horizontal" >

        </com.horizontalscrollView03.MyGallery>

    </HorizontalScrollView>

 

    <!-- 自动切换图片下面的红色横条开始 -->

 

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"  android:layout_below="@id/hsv">

 

        <TextView

            android:id="@+id/te1"

            android:layout_width="fill_parent"

            android:layout_height="2dp"

            android:layout_weight="1"

            android:background="@drawable/product_card_normal" />

 

        <TextView

            android:id="@+id/te2"

            android:layout_width="fill_parent"

            android:layout_height="2dp"

            android:layout_weight="1"

            android:background="@drawable/product_card_normal"

            android:visibility="invisible" />

 

        <TextView

            android:id="@+id/te3"

            android:layout_width="fill_parent"

            android:layout_height="2dp"

            android:layout_weight="1"

            android:background="@drawable/product_card_normal"

            android:visibility="invisible" />

 

        <TextView

            android:id="@+id/te4"

            android:layout_width="fill_parent"

            android:layout_height="2dp"

            android:layout_weight="1"

            android:background="@drawable/product_card_normal"

            android:visibility="invisible" />

 

        <TextView

            android:id="@+id/te5"

            android:layout_width="fill_parent"

            android:layout_height="2dp"

            android:layout_weight="1"

            android:background="@drawable/product_card_normal"

            android:visibility="invisible" />

    </LinearLayout>

</RelativeLayout>

MainActivity.java

-------------------------------------------------------------------------------------

package com.horizontalscrollView03;

import java.util.ArrayList;

import java.util.List;

import java.util.Timer;

import java.util.TimerTask;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.util.DisplayMetrics;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemSelectedListener;

import android.widget.FrameLayout;

import android.widget.HorizontalScrollView;

import android.widget.TextView;

/**

 * 

 * 项目名称:com.horizontalscrollView03   

 * 类  名  称:MainActivity   

 * 类  描  述:幻灯片效果  

 * 创  建  人:fy   

 * 创建时间:2014-3-21 下午4:53:31   

 * Copyright (c) 方勇-版权所有

 */

public class MainActivity extends Activity {

/* 横向滚动菜单 */

private HorizontalScrollView horizontalScrollView;

/* 自定义画廊Gallery */

private MyGallery mGallery;

/* 记录选中的图片位置 */

private int index = 0;

/* 记录幻灯片的 图片资源 */

private int[] mImages = { R.drawable.show1, R.drawable.show2, R.drawable.show3, R.drawable.show4, R.drawable.show5 };

/* 记录幻灯片的 数量 */

private final int IMAGE_COUNT = mImages.length;

/* 屏幕宽度(像素) */

private int width;

/* 红线 */

private TextView te1, te2, te3, te4, te5;

/* 红线集合 */

private List<View> list;

 

/* 开一个线程执行耗时操作,用于更新主线程的UI控件 */

private Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

switch (msg.what) {

case 2:

int pos = index % IMAGE_COUNT;

mGallery.setItemSelected(pos);

break;

default:

break;

}

}

};

 

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViews();

setListeners();

setScreens();

initViews();

}

 

/* 手机屏幕属性 */

private void setScreens() {

// 定义DisplayMetrics 对象

DisplayMetrics metric = new DisplayMetrics();

// 取得窗口属性

getWindowManager().getDefaultDisplay().getMetrics(metric);

width = metric.widthPixels; // 屏幕宽度(像素)

}

 

private void findViews() {

horizontalScrollView = (HorizontalScrollView) findViewById(R.id.hsv);

mGallery = (MyGallery) findViewById(R.id.gallery);

mGallery.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT));

te1 = (TextView) this.findViewById(R.id.te1);

te2 = (TextView) this.findViewById(R.id.te2);

te3 = (TextView) this.findViewById(R.id.te3);

te4 = (TextView) this.findViewById(R.id.te4);

te5 = (TextView) this.findViewById(R.id.te5);

}

 

/* 红线的位置 */

public void showLink(int position) {

switch (position) {

case 0:

for (int i = 0; i < list.size(); i++) {

if (i != 0) {

list.get(i).setVisibility(View.INVISIBLE);

} else {

list.get(i).setVisibility(View.VISIBLE);

}

}

break;

case 1:

for (int i = 0; i < list.size(); i++) {

if (i != 1) {

list.get(i).setVisibility(View.INVISIBLE);

} else {

list.get(i).setVisibility(View.VISIBLE);

}

}

break;

case 2:

for (int i = 0; i < list.size(); i++) {

if (i != 2) {

list.get(i).setVisibility(View.INVISIBLE);

} else {

list.get(i).setVisibility(View.VISIBLE);

}

}

break;

case 3:

for (int i = 0; i < list.size(); i++) {

if (i != 3) {

list.get(i).setVisibility(View.INVISIBLE);

} else {

list.get(i).setVisibility(View.VISIBLE);

}

}

break;

case 4:

for (int i = 0; i < list.size(); i++) {

if (i != 4) {

list.get(i).setVisibility(View.INVISIBLE);

} else {

list.get(i).setVisibility(View.VISIBLE);

}

}

break;

}

}

 

private void setListeners() {

/* 设置小圆点显示,position会一直增加,如果要循环显示图片,需要对position取余,否则数组越界 */

mGallery.setOnItemSelectedListener(new OnItemSelectedListener() {

@Override

public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) {

// TODO Auto-generated method stub

int pos = position % IMAGE_COUNT;

// 显示红线

showLink(position);

if (pos == (IMAGE_COUNT - 1)) {

// 已经是最后一张图片了,重来(从0位置开始)

horizontalScrollView.scrollTo(0, 0);

}

// 移动X宽度=当前位置*屏幕宽度

horizontalScrollView.scrollTo(pos * width, 0);

}

@Override

public void onNothingSelected(AdapterView<?> parent) {

}

});

}

 

/* 初始化幻灯片小圆点、画廊、定时器 */

private void initViews() {

// 红线集合

list = new ArrayList<View>();

list.add(te1);

list.add(te2);

list.add(te3);

list.add(te4);

list.add(te5);

 

ImageAdapter adapter = new ImageAdapter(this, width, mImages);

// 设置画廊Gallery适配器

mGallery.setAdapter(adapter);

// 定时器,使用Message传递消息

Timer timer = new Timer();

// 每隔2秒执行一次调度,延迟2秒执行

timer.schedule(new TimerTask() {

@Override

public void run() {

Message message = new Message();

message.what = 2;

index = mGallery.getSelectedItemPosition();

index++;

if (index > IMAGE_COUNT - 1) {

index = 0;

}

if (index < 0) {

index = list.size() - 1;

}

handler.sendMessage(message);

}

}, 2000, 2000);

}

 

}

MyGallery.java

-------------------------------------------------------------------------------------

package com.horizontalscrollView03;

import android.content.Context;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.widget.AdapterView;

import android.widget.BaseAdapter;

import android.widget.LinearLayout;

/**

 * 

 * 项目名称:com.horizontalscrollView03  

 * 类  名  称:MyGallery   

 * 类  描  述:自定义Gallery画廊

 * 创  建  人:fy   

 * 创建时间:2014-3-21 下午2:27:03   

 * Copyright (c) 方勇-版权所有

 */

public class MyGallery extends LinearLayout {

/* 上下文 */

private Context mContext;

/* 适配器 */

private BaseAdapter adapter;

/* 适配器-->条目选中事件 */

private AdapterView.OnItemSelectedListener onItemSelectedListener;

public static int selectedId = 0;

 

public MyGallery(Context context) {

super(context);

mContext = context;

setOrientation(HORIZONTAL);

}

 

public MyGallery(Context context, AttributeSet attrs) {

super(context, attrs);

mContext = context;

setOrientation(HORIZONTAL);

}

 

/* 适配器-->设置数据 */

public void setAdapter(BaseAdapter adapter) {

this.adapter = adapter;

// 设置条目touch事件

for (int i = 0; i < adapter.getCount(); i++) {

// 条目

View view = adapter.getView(i, null, null);

// 条目位置编号

final int position = i;

// 条目ID

final long id = adapter.getItemId(position);

// 条目touch事件

view.setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

if (onItemSelectedListener != null) {

/**

 * <p>Callback method to be invoked when an item in this view has been

 * selected. This callback is invoked only when the newly selected

 * position is different from the previously selected position or if

 * there was no selected item.</p>

 *

 * Impelmenters can call getItemAtPosition(position) if they need to access the

 * data associated with the selected item.

 *

 * @param parent The AdapterView where the selection happened

 * @param view The view within the AdapterView that was clicked

 * @param position The position of the view in the adapter

 * @param id The row id of the item that is selected

 */

onItemSelectedListener.onItemSelected(null, v, position, id);

}

// 选中的位置

selectedId = position;

return true;

}

});

this.addView(view, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

}

}

 

/* 设置条目选中 */

public void setItemSelected(int position) {

//Toast.makeText(mContext, "" + position, Toast.LENGTH_SHORT).show();

// 选中的位置

selectedId = position;

// 选中的视图

View view = (View) adapter.getView(position, null, null);

onItemSelectedListener.onItemSelected(null, view, position, getItemIdAtPosition(position));

}

 

/* 获取条目位置 */

public int getSelectedItemPosition() {

return selectedId;

}

 

/* 得到条目ID,通过条目位置 */

public long getItemIdAtPosition(int position) {

return (adapter == null || position < 0) ? null : adapter.getItemId(position);

}

 

/* 设置条目选中事件 */

public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener onItemSelectedListener) {

this.onItemSelectedListener = onItemSelectedListener;

}

}

ImageAdapter.java

-------------------------------------------------------------------------------------

package com.horizontalscrollView03;

import android.content.Context;

import android.view.Gravity;

import android.view.View;

import android.view.ViewGroup;

import android.view.ViewGroup.LayoutParams;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.LinearLayout;

/**

 * 

 * 项目名称:com.horizontalscrollView03  

 * 类  名  称:ImageAdapter   

 * 类  描  述:图片适配器   

 * 创  建  人:fy   

 * 创建时间:2014-3-21 下午5:08:56   

 * Copyright (c) 方勇-版权所有

 */

public class ImageAdapter extends BaseAdapter {

private Context context;

/* 手机宽度 */

private int width;

/* 图片资源 */

private int[] mImages;

 

public ImageAdapter(Context context) {

this.context = context;

}

 

public ImageAdapter(Context context, int width,int[] images) {

this.context = context;

this.width = width;

this.mImages = images;

}

 

@Override

public int getCount() {

return mImages.length;// 实现循环显示

}

 

@Override

public Object getItem(int position) {

return position;

}

 

@Override

public long getItemId(int position) {

return position;

}

 

@Override

public View getView(int position, View convertView, ViewGroup parent) {

LinearLayout layout;

if (null == convertView) {

layout = new LinearLayout(context);

} else {

layout = (LinearLayout) convertView;

}

//Log.i("fy", width + "");

layout.setLayoutParams(new LayoutParams(width, LayoutParams.WRAP_CONTENT));

layout.setGravity(Gravity.BOTTOM);

 

ImageView imageView = new ImageView(context);

imageView.setLayoutParams(new LayoutParams(width, LayoutParams.WRAP_CONTENT));

imageView.setImageResource(mImages[position]);

// 图片自动拉伸

imageView.setScaleType(ImageView.ScaleType.FIT_XY);

layout.addView(imageView);

return layout;

}

}

  • 大小: 60.9 KB
  • 大小: 54.5 KB
  • 大小: 59.8 KB
  • 大小: 7.8 KB
  • 大小: 8.2 KB
1
0
分享到:
评论

相关推荐

    HorizontalScrollView实现Gallery

    总的来说,HorizontalScrollView实现Gallery的方法是一种复用现有组件并进行定制的方式,它可以帮助开发者在不使用已被弃用的Gallery组件的情况下,实现类似的功能。这不仅有助于保持代码的兼容性,还能利用...

    gallery模拟horizontalscrollview效果

    要模拟`Gallery`的效果,我们可以使用`HorizontalScrollView`或`RecyclerView`。下面分别介绍这两种方法: 1. **使用HorizontalScrollView**: - `HorizontalScrollView`是一个可以容纳单个子视图并支持水平滚动的...

    Android,自定义HorizontalScrollView,实现分页效果

    在这个主题中,我们将深入探讨如何自定义HorizontalScrollView来达到这样的效果。HorizontalScrollView是Android提供的一个水平方向的滚动视图,允许用户水平滑动查看超出屏幕范围的内容。 首先,我们了解`scrollTo...

    Android 自定义 HorizontalScrollView 打造超强 Gallery效果 完整实例源码

    在这个特定的实例中,我们将探讨如何通过自定义HorizontalScrollView打造一个强大的Gallery效果。 Gallery组件在早期版本的Android API中被广泛用于展示一系列的图片或元素,用户可以左右滑动来浏览。然而,随着...

    Android,自定义HorizontalScrollView,实现过度滑动时回弹效果

    本文将深入探讨如何自定义一个HorizontalScrollView,以实现当用户过度滑动时的回弹效果,这种效果通常被称为“橡皮筋效果”或“弹性滚动”。在Android系统中,标准的HorizontalScrollView并不直接支持这种边界反馈...

    Android HorizontalScrollView实现横向Gallery

    然而,Gallery已在Android API Level 17中被弃用,开发者被推荐使用其他替代方案,如RecyclerView或HorizontalScrollView。HorizontalScrollView则是一个更基础的视图容器,它可以容纳一个或者多个水平排列的子视图...

    Android自定义HorizontalScrollView打造超强Gallery效果

    自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果。的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来...

    HorizontalScrollView和ViewPager联动效果

    HorizontalScrollView允许用户水平滚动一个包含多个View的布局,而ViewPager则通常用于实现滑动页面的效果,如在应用的TabLayout下展示多个Fragment。这两者联动可以创建出更加丰富的用户交互体验。 在Android开发...

    HorizontalScrollView

    在Android UI设计中,HorizontalScrollView经常与其他视图组件结合使用,以实现更加复杂的布局效果。例如,题目中提到的"GridView + HorizontalScrollView组合成的横向listview",这是一个巧妙的设计,将GridView的...

    android HorizontalScrollView和ViewPager联动效果

    在Android开发中,HorizontalScrollView和ViewPager是两种常用的布局组件,它们各自有特定的功能,并且在某些场景下可以结合使用以实现独特的交互效果。本资源主要探讨了如何将这两个组件联动,尤其是在上下控件间...

    HorizontalScrollView代替Gallery

    HorizontalScrollView用于布局的容器,可以放置让用户使用滚动条查看的视图层次结构,允许视图结构比手机的屏幕大.。HorizontalScrollView 是一种 框架布局, 这意味着你可以将包含要滚动的完整内容的子视图放入该...

    HorizontalScrollView创建的Gallery

    在本例中,"HorizontalScrollView 创建的 Gallery" 指的是利用 HorizontalScrollView 来实现类似传统 Gallery 组件的效果。在 Android 的早期版本中,Gallery 是一个可以左右滑动来浏览多个项目的控件,但在后来的...

    horizontalscrollView

    `ViewPager`虽然默认是垂直滚动的,但是配合`HorizontalScrollView`,我们可以实现水平切换图片的效果。 ```java public class ImagePagerAdapter extends PagerAdapter { private List&lt;String&gt; imageUrlList; /...

    Android ViewPager与仿Gallery的HorizontalScrollView互相滑动监听

    在Android开发中,`ViewPager`和仿`Gallery`的`HorizontalScrollView`是两种常见的滚动视图组件。`ViewPager`主要用于实现页面间的滑动切换,通常用于实现类似TabLayout的效果;而`HorizontalScrollView`则允许用户...

    导航栏联动效果( HorizontalScrollView+ViewPager)

    在Android开发中,创建动态、交互丰富的用户界面是至关重要的,而"导航栏联动效果(HorizontalScrollView+ViewPager)"正是实现这一目标的一种有效方法。这种技术通常用于电商平台、新闻应用等,提供一种平滑的横向...

    Android 自定义 HorizontalScrollView 替代Gallery

    原生的Android SDK提供了Gallery组件,但自Android 3.0(API级别11)起,Gallery已被弃用,推荐使用HorizontalScrollView或RecyclerView等替代品。本文将深入探讨如何使用自定义的HorizontalScrollView来实现类似...

    HorizontalScrollView打造的相册效果

    近期看了一堂某在线IT学习的视频公开课,这里就不说名字了,省的有打广告的...讲到了利用HorizontalScrollView仿ViewPager设计的一个简单相册。其实主要用了ViewPager缓存的思想。自已尝试实现了一个,大家可以看一下。

Global site tag (gtag.js) - Google Analytics