关于类似美团团购gallery的联动更新

本文详细介绍了如何在美团应用中优化Gallery组件的滑动体验,采用单页滑动机制并去除了快速滑动与回弹效果。通过自定义Gallery类,实现对滑动事件的特殊处理,包括按键事件响应和速度限制。同时,通过调整视觉效果,提升用户体验。此外,还探讨了日期导航和列表显示电影安排的实现方法,以及与RadioGroup和ViewPager的关联处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在美团上的gallery是进行过修改的,主要的改动是滑动的时候一次一个,没有快速滑动,去掉了回弹效果。

猜测实现的代码是:

import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.widget.Gallery;

public class SlideOnePageGallery extends Gallery {
	private static final String TAG = "SlideOnePageGallery";
	private Context mContext;

	public SlideOnePageGallery(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		this.mContext = context;
	}

	public SlideOnePageGallery(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.mContext = context;
	}

	public SlideOnePageGallery(Context context) {
		super(context);
		this.mContext = context;
	}


	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		int kEvent;
		if (isScrollingLeft(e1, e2)) {
			kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
		} else {
			kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
		}
		onKeyDown(kEvent, null);
		return false;

	}

	private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {
		return e2.getX() > e1.getX();
	}

}

以上代码肯定不是他的实现方式,因为仔细看的话他们应该还有速度大小的监听,即对velocityX的值大小有限制,防止太慢,混淆和scroll的区别。

然后是对监听的设置:

movieGallery.setCallbackDuringFling(false);
			movieGallery.setUnselectedAlpha(1.0f);
			movieGallery
					.setOnItemSelectedListener(new OnItemSelectedListener() {

						@Override
						public void onItemSelected(AdapterView<?> parent,
								final View view, int position, long id) {
							if (last_view != null) {
								if ((view instanceof FrameLayout)
										&& (last_view instanceof FrameLayout)) {

									Log.i(TAG, "FrameLayout");
									((FrameLayout) last_view)
											.setForeground(mContext
													.getResources()
													.getDrawable(
															R.drawable.foreground_dark));
									last_view = view;
									// ResourceUtils
									// .startBrightnessAnim(((ImageView)
									// ((FrameLayout) last_view)
									// .findViewById(R.id.photoview_image))
									// .getDrawable());
									((FrameLayout) last_view)
											.setForeground(mContext
													.getResources()
													.getDrawable(
															R.drawable.foreground_light));

								} else {

									Log.i(TAG, "View");
								}
							} else {
								last_view = view;
								// ResourceUtils
								// .startBrightnessAnim(((ImageView)
								// ((FrameLayout) last_view)
								// .findViewById(R.id.photoview_image))
								// .getDrawable());
								((FrameLayout) last_view)
										.setForeground(mContext
												.getResources()
												.getDrawable(
														R.drawable.foreground_light));

							}

							toShowIndex = position;
							final Handler handler = new Handler() {
								@Override
								public void handleMessage(Message msg) {
									if (showingIndex != toShowIndex) {
										showingIndex = toShowIndex;

										movie_title.setText(mMovies
												.get(showingIndex
														% mMovies.size()).moviename);
										movie_grade.setText(mMovies
												.get(showingIndex
														% mMovies.size()).generalmark);
										DataListMovies(
												mCinema.cinemaid,
												mMovies.get(showingIndex
														% mMovies.size()).movieid);
									}
								}
							};
							Thread checkChange = new Thread() {
								@Override
								public void run() {
									int myIndex = toShowIndex;
									try {
										sleep(TIME_OUT_DISPLAY);
										if (myIndex == toShowIndex) {
											handler.sendEmptyMessage(0);

										}
									} catch (InterruptedException e) {
										e.printStackTrace();
									}
								}
							};

							checkChange.start();
						}

						@Override
						public void onNothingSelected(AdapterView<?> parent) {
							// TODO Auto-generated method stub

						}
					});

上面的实现是将选中的view的前景色变亮,未选中的变暗,同时关联大下面电影详情部分的变化,列出场次。

对于日期导航,使用HorizontalScrollView和RadioGroup来实现。列表显示电影安排使用viewpager。

同时在viewpager的监听和RadioGroup的监听做关联处理,同时动态滚动HorizontalScrollView。

在这些处理时遇到的问题及解决的办法在前面已经有了文章说明,可以从这里看到。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值