效果
-------------------------------------------------------------------------------------------------------------------------------
素材
-------------------------------------------------------------------------------------------------------------------------------
activity_main.xml
-------------------------------------------------------------------------------------------------------------------------------
|
|
MainActivity.java
-------------------------------------------------------------------------------------------------------------------------------
package com.horizontalscrollView02;
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.HorizontalScrollView;
import android.widget.ImageView;
/**
*
* 项目名称:com.horizontalscrollView02
* 类 名 称: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 static final int IMAGE_COUNT = 3;
/* 记录幻灯片圆点图片 */
private ImageView[] mImageViewIds;// 小圆点ImageView数组
/* 屏幕宽度(像素) */
private int width;
/* 开一个线程执行耗时操作,用于更新主线程的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);
mImageViewIds = new ImageView[] { (ImageView) findViewById(R.id.dot_1), (ImageView) findViewById(R.id.dot_2),
(ImageView) findViewById(R.id.dot_3) };
}
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;
mImageViewIds[pos].setImageDrawable(getBaseContext().getResources().getDrawable(R.drawable.ic_dot_focused));
if (pos > 0) {
mImageViewIds[pos - 1].setImageDrawable(getBaseContext().getResources().getDrawable(R.drawable.ic_dot_normal));
}
if (pos < (IMAGE_COUNT - 1)) {
// 已经是最后一张图片了,重来(从0位置开始)
horizontalScrollView.scrollTo(0, 0);
mImageViewIds[pos + 1].setImageDrawable(getBaseContext().getResources().getDrawable(R.drawable.ic_dot_normal));
}
if (pos == 0) {
mImageViewIds[IMAGE_COUNT - 1].setImageDrawable(getBaseContext().getResources().getDrawable(R.drawable.ic_dot_normal));
}
// 移动X宽度=当前位置*屏幕宽度
horizontalScrollView.scrollTo(pos * width, 0);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
/* 初始化幻灯片小圆点、画廊、定时器 */
private void initViews() {
// 默认选中
mImageViewIds[0].setImageDrawable(getBaseContext().getResources().getDrawable(R.drawable.ic_dot_focused));
ImageAdapter adapter = new ImageAdapter(this);
// 设置画廊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++;
handler.sendMessage(message);
}
}, 2000, 2000);
}
}
ImageAdapter.java
-------------------------------------------------------------------------------------------------------------------------------
package com.horizontalscrollView02;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
/**
*
* 项目名称:com.horizontalscrollView02
* 类 名 称:ImageAdapter
* 类 描 述:图片适配器
* 创 建 人:fy
* 创建时间:2014-3-21 下午5:08:56
* Copyright (c) 方勇-版权所有
*/
public class ImageAdapter extends BaseAdapter {
private Context context;
private int[] mImages = { R.drawable.img001, R.drawable.img002, R.drawable.img003 };
public ImageAdapter(Context context) {
this.context = context;
}
@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) {
ImageView imageView;
if(null==convertView){
imageView = new ImageView(context);
}else{
imageView = (ImageView) convertView;
}
imageView.setImageResource(mImages[position]);
return imageView;
}
}
MyGallery.java
-------------------------------------------------------------------------------------------------------------------------------
package com.horizontalscrollView02;
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;
import android.widget.Toast;
/**
*
* 项目名称:com.horizontalscrollView02
* 类 名 称: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;
}
public long getItemIdAtPosition(int position) {
return (adapter == null || position < 0) ? null : adapter.getItemId(position);
}
public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener onItemSelectedListener) {
this.onItemSelectedListener = onItemSelectedListener;
}
}
相关推荐
总的来说,HorizontalScrollView实现Gallery的方法是一种复用现有组件并进行定制的方式,它可以帮助开发者在不使用已被弃用的Gallery组件的情况下,实现类似的功能。这不仅有助于保持代码的兼容性,还能利用...
要模拟`Gallery`的效果,我们可以使用`HorizontalScrollView`或`RecyclerView`。下面分别介绍这两种方法: 1. **使用HorizontalScrollView**: - `HorizontalScrollView`是一个可以容纳单个子视图并支持水平滚动的...
在这个特定的实例中,我们将探讨如何通过自定义HorizontalScrollView打造一个强大的Gallery效果。 Gallery组件在早期版本的Android API中被广泛用于展示一系列的图片或元素,用户可以左右滑动来浏览。然而,随着...
在这个主题中,我们将深入探讨如何自定义HorizontalScrollView来达到这样的效果。HorizontalScrollView是Android提供的一个水平方向的滚动视图,允许用户水平滑动查看超出屏幕范围的内容。 首先,我们了解`scrollTo...
本文将深入探讨如何自定义一个HorizontalScrollView,以实现当用户过度滑动时的回弹效果,这种效果通常被称为“橡皮筋效果”或“弹性滚动”。在Android系统中,标准的HorizontalScrollView并不直接支持这种边界反馈...
然而,Gallery已在Android API Level 17中被弃用,开发者被推荐使用其他替代方案,如RecyclerView或HorizontalScrollView。HorizontalScrollView则是一个更基础的视图容器,它可以容纳一个或者多个水平排列的子视图...
HorizontalScrollView允许用户水平滚动一个包含多个View的布局,而ViewPager则通常用于实现滑动页面的效果,如在应用的TabLayout下展示多个Fragment。这两者联动可以创建出更加丰富的用户交互体验。 在Android开发...
3. **HorizontalScrollView**:虽然HorizontalScrollView并不是专为幻灯片设计的,但可以通过结合ScrollView的滚动事件和动态加载内容来实现类似效果。 接下来,我们讨论如何在Android中仿制淘宝商品详情页的图片...
在Android开发中,HorizontalScrollView和ViewPager是两种常用的布局组件,它们各自有特定的功能,并且在某些场景下可以结合使用以实现独特的交互效果。本资源主要探讨了如何将这两个组件联动,尤其是在上下控件间...
自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果。的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来...
近期看了一堂某在线IT学习的视频公开课,这里就不说名字了,省的有打广告的...讲到了利用HorizontalScrollView仿ViewPager设计的一个简单相册。其实主要用了ViewPager缓存的思想。自已尝试实现了一个,大家可以看一下。
HorizontalScrollView仿gallery 照片墙效果,添加监听当前滑动到第几页,添加动态添加效果,代码简单有需要自己扩展.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
在Android UI设计中,HorizontalScrollView经常与其他视图组件结合使用,以实现更加复杂的布局效果。例如,题目中提到的"GridView + HorizontalScrollView组合成的横向listview",这是一个巧妙的设计,将GridView的...
HorizontalScrollView用于布局的容器,可以放置让用户使用滚动条查看的视图层次结构,允许视图结构比手机的屏幕大.。HorizontalScrollView 是一种 框架布局, 这意味着你可以将包含要滚动的完整内容的子视图放入该...
在Android开发中,`HorizontalScrollView`是一个非常实用的布局组件,它允许用户通过水平滑动来查看超过屏幕宽度的内容。这个组件通常用于实现图片轮播、菜单滚动等效果。在这个"horizontalscrollView"项目中,我们...
在本例中,"HorizontalScrollView 创建的 Gallery" 指的是利用 HorizontalScrollView 来实现类似传统 Gallery 组件的效果。在 Android 的早期版本中,Gallery 是一个可以左右滑动来浏览多个项目的控件,但在后来的...
在Android开发中,创建动态、交互丰富的用户界面是至关重要的,而"导航栏联动效果(HorizontalScrollView+ViewPager)"正是实现这一目标的一种有效方法。这种技术通常用于电商平台、新闻应用等,提供一种平滑的横向...