在美团上的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。
在这些处理时遇到的问题及解决的办法在前面已经有了文章说明,可以从这里看到。