高仿京东APP

逃离我推掉我的手 2022-08-21 10:48 251阅读 0赞

最近在网上找了一个关于京东网站的源码,链接地址:
京东高仿App下载
发现其中有几个亮点:
一,用动画代替进度条;
二、对Tabhost加载Activity的运用(还在研究)
三、对于Gallery的运用;
四、对ViewPager的运用;
五、对自定义AbScrollView的运用(分有背景和没有背景的,待下一步研究;
六、关于调用二维码(条形码)的扫一扫(应该是关于API的,待继续研究)。
首先来看第一个关于动画的界面:
这里写图片描述
此画面为布局时的静态图,作者这里没有用进度条,可能是因为不够美观吧,那作者是怎么实现的呢?答案已经说了,是动画,思路非常简单,就是初始化ImageView控件,然后加载xml文件写的动画,然后给动画加一个监听事件,最后将ImageView设为动画,java代码如下:

  1. package com.itau.jingdong.ui;
  2. import android.os.Bundle;
  3. import android.os.Handler;
  4. import android.util.DisplayMetrics;
  5. import android.view.animation.Animation;
  6. import android.view.animation.Animation.AnimationListener;
  7. import android.view.animation.AnimationUtils;
  8. import android.widget.ImageView;
  9. import com.itau.jingdong.R;
  10. import com.itau.jingdong.config.Constants;
  11. import com.itau.jingdong.ui.base.BaseActivity;
  12. public class SplashActivity extends BaseActivity {
  13. public static final String TAG = SplashActivity.class.getSimpleName();
  14. private ImageView mSplashItem_iv = null;
  15. /* * (non-Javadoc) * * @see com.itau.tmall.ui.base.BaseActivity#findViewById() */
  16. @Override
  17. protected void findViewById() {
  18. // TODO Auto-generated method stub
  19. mSplashItem_iv = (ImageView) findViewById(R.id.splash_loading_item);
  20. }
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. // TODO Auto-generated method stub
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_splash);
  26. DisplayMetrics metrics = new DisplayMetrics();
  27. getWindowManager().getDefaultDisplay().getMetrics(metrics);
  28. Constants.SCREEN_DENSITY = metrics.density;
  29. Constants.SCREEN_HEIGHT = metrics.heightPixels;
  30. Constants.SCREEN_WIDTH = metrics.widthPixels;
  31. mHandler = new Handler(getMainLooper());
  32. findViewById();
  33. initView();
  34. }
  35. /* * (non-Javadoc) * * @see com.itau.jingdong.ui.base.BaseActivity#initView() */
  36. @Override
  37. protected void initView() {
  38. // TODO Auto-generated method stub
  39. Animation translate = AnimationUtils.loadAnimation(this,
  40. R.anim.splash_loading);
  41. translate.setAnimationListener(new AnimationListener() {
  42. @Override
  43. public void onAnimationStart(Animation animation) {
  44. // TODO Auto-generated method stub
  45. }
  46. @Override
  47. public void onAnimationRepeat(Animation animation) {
  48. // TODO Auto-generated method stub
  49. }
  50. @Override
  51. public void onAnimationEnd(Animation animation) {
  52. // TODO Auto-generated method stub
  53. //启动homeactivty,相当于Intent
  54. openActivity(HomeActivity.class);
  55. overridePendingTransition(R.anim.push_left_in,
  56. R.anim.push_left_out);
  57. SplashActivity.this.finish();
  58. }
  59. });
  60. mSplashItem_iv.setAnimation(translate);
  61. }
  62. }

xml布局的ImageView动画代码如下:
R.anim.splash_loading:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromXDelta="0.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:toXDelta="60%p" android:fillAfter="true" />
  3. android:fromXDelta="0" android:toXDelta="-100%p" 往左边消失
  4. android:fromXDelta="-100%p" android:toXDelta="0" 从左边进
  5. android:fromXDelta="0" android:toXDelta="100%p" 往右边消失
  6. android:fromXDelta="100%p" android:toXDelta="0" 从右边进
  7. fillBefore是指动画结束时画面停留在此动画的第一帧; 默认值为true
  8. fillAfter是指动画结束是画面停留在此动画的最后一帧。默认值为false
  9. Interpolator对象 资源ID 功能作用
  10. AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 先加速再减速
  11. AccelerateInterpolator @android:anim/accelerate_interpolator 加速
  12. AnticipateInterpolator @android:anim/anticipate_interpolator 先回退一小步然后加速前进
  13. AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 在上一个基础上超出终点一小步再回到终点
  14. BounceInterpolator @android:anim/bounce_interpolator 最后阶段弹球效果
  15. CycleInterpolator @android:anim/cycle_interpolator 周期运动
  16. DecelerateInterpolator @android:anim/decelerate_interpolator 减速
  17. LinearInterpolator @android:anim/linear_interpolator 匀速
  18. OvershootInterpolator @android:anim/overshoot_interpolator 快速到达终点并超出一小步最后回到终点
  19. R.anim.push_left_in:
  20. <?xml version="1.0" encoding="utf-8"?>
  21. <set xmlns:android="http://schemas.android.com/apk/res/android">
  22. <translate android:fromXDelta="100%" android:toXDelta="0" android:duration="600" />
  23. </set>
  24. R.anim.push_left_out:
  25. <?xml version="1.0" encoding="utf-8"?>
  26. <set xmlns:android="http://schemas.android.com/apk/res/android">
  27. <translate android:fromXDelta="0" android:toXDelta="-100%" android:duration="600" />
  28. </set>

android:toXDelta=”60%p”这一句是在右边消失,大家可以多测试几个数据看看效果就明白为什么不是100%p了!

接下来讨论第二个问题:对于Gallery和ViewPager的应用,还是先贴图
这里写图片描述
首先,每张图片都是可动的,布局结构很简单,这里写图片描述
第一个是ViewPager,第二个LinerLayout是ViewPager下面的长条,在ViewPager里面的图片运动时,下面的红色长条表示当前图片,节奏保持一致,第三个和第四个都是Gallery图片可以左右拨动,只是在图层下面多加了文字,首先来看看自定义的ViewPager是怎么回事:

  1. package com.itau.jingdong.widgets.jazzviewpager;
  2. import java.util.HashMap;
  3. import java.util.LinkedHashMap;
  4. import com.itau.jingdong.R;
  5. import com.nineoldandroids.view.ViewHelper;
  6. import android.content.Context;
  7. import android.graphics.Camera;
  8. import android.graphics.Color;
  9. import android.graphics.Matrix;
  10. import android.support.v4.view.PagerAdapter;
  11. import android.support.v4.view.ViewPager;
  12. import android.util.AttributeSet;
  13. import android.util.Log;
  14. import android.view.MotionEvent;
  15. import android.view.View;
  16. public class JazzyViewPager extends ViewPager {
  17. public static final String TAG = "JazzyViewPager";
  18. private boolean mEnabled = true;
  19. private boolean mFadeEnabled = false;
  20. private boolean mOutlineEnabled = false;
  21. public static int sOutlineColor = Color.WHITE;
  22. private TransitionEffect mEffect = TransitionEffect.Standard;
  23. private HashMap<Integer, Object> mObjs = new LinkedHashMap<Integer, Object>();
  24. private static final float SCALE_MAX = 0.5f;
  25. private static final float ZOOM_MAX = 0.5f;
  26. private static final float ROT_MAX = 15.0f;
  27. public enum TransitionEffect {
  28. Standard, Tablet, CubeIn, CubeOut, FlipVertical, FlipHorizontal, Stack, ZoomIn, ZoomOut, RotateUp, RotateDown, Accordion
  29. //这些都是代表当前的图片是那张
  30. }
  31. public JazzyViewPager(Context context) {
  32. this(context, null);
  33. }
  34. @SuppressWarnings("incomplete-switch")
  35. public JazzyViewPager(Context context, AttributeSet attrs) {
  36. super(context, attrs);
  37. setClipChildren(false);//是否限制子View在其范围内
  38. // TypedArray ta = context.obtainStyledAttributes(attrs,
  39. // R.styleable.JazzyViewPager);
  40. // int effect = ta.getInt(R.styleable.JazzyViewPager_style, 0);
  41. String[] transitions = getResources().getStringArray(
  42. R.array.jazzy_effects);
  43. int effect = 0;
  44. setTransitionEffect(TransitionEffect.valueOf(transitions[0]));
  45. setFadeEnabled(
  46. false);
  47. setOutlineEnabled( false);
  48. setOutlineColor(
  49. Color.WHITE);
  50. // Log.i("tarena", "0-->"+effect+"11"+transitions.length+","+
  51. // ta.getBoolean(R.styleable.JazzyViewPager_fadeEnabled,false)+","+
  52. // ta.getBoolean(R.styleable.JazzyViewPager_outlineEnabled, false)+","+
  53. // ta.getColor(R.styleable.JazzyViewPager_outlineColor,Color.WHITE)+"");
  54. switch (mEffect) {
  55. case Stack:
  56. case ZoomOut:
  57. setFadeEnabled(true);
  58. }
  59. // ta.recycle();
  60. }
  61. public void setTransitionEffect(TransitionEffect effect) {
  62. mEffect = effect;
  63. }
  64. public void setPagingEnabled(boolean enabled) {
  65. mEnabled = enabled;
  66. }
  67. public void setFadeEnabled(boolean enabled) {
  68. mFadeEnabled = enabled;
  69. }
  70. public boolean getFadeEnabled() {
  71. return mFadeEnabled;
  72. }
  73. public void setOutlineEnabled(boolean enabled) {
  74. mOutlineEnabled = enabled;
  75. wrapWithOutlines();
  76. }
  77. public void setOutlineColor(int color) {
  78. sOutlineColor = color;
  79. }
  80. private void wrapWithOutlines() {
  81. for (int i = 0; i < getChildCount(); i++) {
  82. View v = getChildAt(i);
  83. if (!(v instanceof OutlineContainer)) {
  84. removeView(v);
  85. super.addView(wrapChild(v), i);
  86. }
  87. }
  88. }
  89. private View wrapChild(View child) {
  90. if (!mOutlineEnabled || child instanceof OutlineContainer)
  91. return child;
  92. OutlineContainer out = new OutlineContainer(getContext());
  93. out.setLayoutParams(generateDefaultLayoutParams());
  94. child.setLayoutParams(new OutlineContainer.LayoutParams(
  95. LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
  96. out.addView(child);
  97. return out;
  98. }
  99. public void addView(View child) {
  100. super.addView(wrapChild(child));
  101. }
  102. public void addView(View child, int index) {
  103. super.addView(wrapChild(child), index);
  104. }
  105. public void addView(View child, LayoutParams params) {
  106. super.addView(wrapChild(child), params);
  107. }
  108. public void addView(View child, int width, int height) {
  109. super.addView(wrapChild(child), width, height);
  110. }
  111. public void addView(View child, int index, LayoutParams params) {
  112. super.addView(wrapChild(child), index, params);
  113. }
  114. @Override
  115. public boolean onInterceptTouchEvent(MotionEvent arg0) {
  116. return mEnabled ? super.onInterceptTouchEvent(arg0) : false;
  117. }
  118. private State mState;
  119. private int oldPage;
  120. private View mLeft;
  121. private View mRight;
  122. private float mRot;
  123. private float mTrans;
  124. private float mScale;
  125. public enum TransitionEffect {
  126. Standard, Tablet, CubeIn, CubeOut, FlipVertical, FlipHorizontal, Stack, ZoomIn, ZoomOut, RotateUp, RotateDown, Accordion
  127. //这些都是代表当前的图片是那张
  128. }
  129. private void logState(View v, String title) {
  130. Log.v(TAG,
  131. title + ": ROT (" + ViewHelper.getRotation(v) + ", "
  132. + ViewHelper.getRotationX(v) + ", "
  133. + ViewHelper.getRotationY(v) + "), TRANS ("
  134. + ViewHelper.getTranslationX(v) + ", "
  135. + ViewHelper.getTranslationY(v) + "), SCALE ("
  136. + ViewHelper.getScaleX(v) + ", "
  137. + ViewHelper.getScaleY(v) + "), ALPHA "
  138. + ViewHelper.getAlpha(v));
  139. }
  140. protected void animateScroll(int position, float positionOffset) {
  141. if (mState != State.IDLE) {
  142. mRot = (float) (1 - Math.cos(2 * Math.PI * positionOffset)) / 2 * 30.0f;
  143. ViewHelper.setRotationY(this, mState == State.GOING_RIGHT ? mRot
  144. : -mRot);
  145. ViewHelper.setPivotX(this, getMeasuredWidth() * 0.5f);
  146. ViewHelper.setPivotY(this, getMeasuredHeight() * 0.5f);
  147. }
  148. }
  149. protected void animateTablet(View left, View right, float positionOffset) {
  150. if (mState != State.IDLE) {
  151. if (left != null) {
  152. mRot = 30.0f * positionOffset;
  153. mTrans = getOffsetXForRotation(mRot, left.getMeasuredWidth(),
  154. left.getMeasuredHeight());
  155. ViewHelper.setPivotX(left, left.getMeasuredWidth() / 2);
  156. ViewHelper.setPivotY(left, left.getMeasuredHeight() / 2);
  157. ViewHelper.setTranslationX(left, mTrans);
  158. ViewHelper.setRotationY(left, mRot);
  159. logState(left, "Left");
  160. }
  161. if (right != null) {
  162. mRot = -30.0f * (1 - positionOffset);
  163. mTrans = getOffsetXForRotation(mRot, right.getMeasuredWidth(),
  164. right.getMeasuredHeight());
  165. ViewHelper.setPivotX(right, right.getMeasuredWidth() * 0.5f);
  166. ViewHelper.setPivotY(right, right.getMeasuredHeight() * 0.5f);
  167. ViewHelper.setTranslationX(right, mTrans);
  168. ViewHelper.setRotationY(right, mRot);
  169. logState(right, "Right");
  170. }
  171. }
  172. }
  173. private void animateCube(View left, View right, float positionOffset,
  174. boolean in) {
  175. if (mState != State.IDLE) {
  176. if (left != null) {
  177. mRot = (in ? 90.0f : -90.0f) * positionOffset;
  178. ViewHelper.setPivotX(left, left.getMeasuredWidth());
  179. ViewHelper.setPivotY(left, left.getMeasuredHeight() * 0.5f);
  180. ViewHelper.setRotationY(left, mRot);
  181. }
  182. if (right != null) {
  183. mRot = -(in ? 90.0f : -90.0f) * (1 - positionOffset);
  184. ViewHelper.setPivotX(right, 0);
  185. ViewHelper.setPivotY(right, right.getMeasuredHeight() * 0.5f);
  186. ViewHelper.setRotationY(right, mRot);
  187. }
  188. }
  189. }
  190. private void animateAccordion(View left, View right, float positionOffset) {
  191. if (mState != State.IDLE) {
  192. if (left != null) {
  193. ViewHelper.setPivotX(left, left.getMeasuredWidth());
  194. ViewHelper.setPivotY(left, 0);
  195. ViewHelper.setScaleX(left, 1 - positionOffset);
  196. }
  197. if (right != null) {
  198. ViewHelper.setPivotX(right, 0);
  199. ViewHelper.setPivotY(right, 0);
  200. ViewHelper.setScaleX(right, positionOffset);
  201. }
  202. }
  203. }
  204. private void animateZoom(View left, View right, float positionOffset,
  205. boolean in) {
  206. if (mState != State.IDLE) {
  207. if (left != null) {
  208. mScale = in ? ZOOM_MAX + (1 - ZOOM_MAX) * (1 - positionOffset)
  209. : 1 + ZOOM_MAX - ZOOM_MAX * (1 - positionOffset);
  210. ViewHelper.setPivotX(left, left.getMeasuredWidth() * 0.5f);
  211. ViewHelper.setPivotY(left, left.getMeasuredHeight() * 0.5f);
  212. ViewHelper.setScaleX(left, mScale);
  213. ViewHelper.setScaleY(left, mScale);
  214. }
  215. if (right != null) {
  216. mScale = in ? ZOOM_MAX + (1 - ZOOM_MAX) * positionOffset : 1
  217. + ZOOM_MAX - ZOOM_MAX * positionOffset;
  218. ViewHelper.setPivotX(right, right.getMeasuredWidth() * 0.5f);
  219. ViewHelper.setPivotY(right, right.getMeasuredHeight() * 0.5f);
  220. ViewHelper.setScaleX(right, mScale);
  221. ViewHelper.setScaleY(right, mScale);
  222. }
  223. }
  224. }
  225. private void animateRotate(View left, View right, float positionOffset,
  226. boolean up) {
  227. if (mState != State.IDLE) {
  228. if (left != null) {
  229. mRot = (up ? 1 : -1) * (ROT_MAX * positionOffset);
  230. mTrans = (up ? -1 : 1)
  231. * (float) (getMeasuredHeight() - getMeasuredHeight()
  232. * Math.cos(mRot * Math.PI / 180.0f));
  233. ViewHelper.setPivotX(left, left.getMeasuredWidth() * 0.5f);
  234. ViewHelper.setPivotY(left, up ? 0 : left.getMeasuredHeight());
  235. ViewHelper.setTranslationY(left, mTrans);
  236. ViewHelper.setRotation(left, mRot);
  237. }
  238. if (right != null) {
  239. mRot = (up ? 1 : -1) * (-ROT_MAX + ROT_MAX * positionOffset);
  240. mTrans = (up ? -1 : 1)
  241. * (float) (getMeasuredHeight() - getMeasuredHeight()
  242. * Math.cos(mRot * Math.PI / 180.0f));
  243. ViewHelper.setPivotX(right, right.getMeasuredWidth() * 0.5f);
  244. ViewHelper.setPivotY(right, up ? 0 : right.getMeasuredHeight());
  245. ViewHelper.setTranslationY(right, mTrans);
  246. ViewHelper.setRotation(right, mRot);
  247. }
  248. }
  249. }
  250. private void animateFlipHorizontal(View left, View right,
  251. float positionOffset, int positionOffsetPixels) {
  252. if (mState != State.IDLE) {
  253. if (left != null) {
  254. mRot = 180.0f * positionOffset;
  255. if (mRot > 90.0f) {
  256. left.setVisibility(View.INVISIBLE);
  257. } else {
  258. if (left.getVisibility() == View.INVISIBLE)
  259. left.setVisibility(View.VISIBLE);
  260. mTrans = positionOffsetPixels;
  261. ViewHelper.setPivotX(left, left.getMeasuredWidth() * 0.5f);
  262. ViewHelper.setPivotY(left, left.getMeasuredHeight() * 0.5f);
  263. ViewHelper.setTranslationX(left, mTrans);
  264. ViewHelper.setRotationY(left, mRot);
  265. }
  266. }
  267. if (right != null) {
  268. mRot = -180.0f * (1 - positionOffset);
  269. if (mRot < -90.0f) {
  270. right.setVisibility(View.INVISIBLE);
  271. } else {
  272. if (right.getVisibility() == View.INVISIBLE)
  273. right.setVisibility(View.VISIBLE);
  274. mTrans = -getWidth() - getPageMargin()
  275. + positionOffsetPixels;
  276. ViewHelper
  277. .setPivotX(right, right.getMeasuredWidth() * 0.5f);
  278. ViewHelper.setPivotY(right,
  279. right.getMeasuredHeight() * 0.5f);
  280. ViewHelper.setTranslationX(right, mTrans);
  281. ViewHelper.setRotationY(right, mRot);
  282. }
  283. }
  284. }
  285. }
  286. private void animateFlipVertical(View left, View right,
  287. float positionOffset, int positionOffsetPixels) {
  288. if (mState != State.IDLE) {
  289. if (left != null) {
  290. mRot = 180.0f * positionOffset;
  291. if (mRot > 90.0f) {
  292. left.setVisibility(View.INVISIBLE);
  293. } else {
  294. if (left.getVisibility() == View.INVISIBLE)
  295. left.setVisibility(View.VISIBLE);
  296. mTrans = positionOffsetPixels;
  297. ViewHelper.setPivotX(left, left.getMeasuredWidth() * 0.5f);
  298. ViewHelper.setPivotY(left, left.getMeasuredHeight() * 0.5f);
  299. ViewHelper.setTranslationX(left, mTrans);
  300. ViewHelper.setRotationX(left, mRot);
  301. }
  302. }
  303. if (right != null) {
  304. mRot = -180.0f * (1 - positionOffset);
  305. if (mRot < -90.0f) {
  306. right.setVisibility(View.INVISIBLE);
  307. } else {
  308. if (right.getVisibility() == View.INVISIBLE)
  309. right.setVisibility(View.VISIBLE);
  310. mTrans = -getWidth() - getPageMargin()
  311. + positionOffsetPixels;
  312. ViewHelper
  313. .setPivotX(right, right.getMeasuredWidth() * 0.5f);
  314. ViewHelper.setPivotY(right,
  315. right.getMeasuredHeight() * 0.5f);
  316. ViewHelper.setTranslationX(right, mTrans);
  317. ViewHelper.setRotationX(right, mRot);
  318. }
  319. }
  320. }
  321. }
  322. protected void animateStack(View left, View right, float positionOffset,
  323. int positionOffsetPixels) {
  324. if (mState != State.IDLE) {
  325. if (right != null) {
  326. mScale = (1 - SCALE_MAX) * positionOffset + SCALE_MAX;
  327. mTrans = -getWidth() - getPageMargin() + positionOffsetPixels;
  328. ViewHelper.setScaleX(right, mScale);
  329. ViewHelper.setScaleY(right, mScale);
  330. ViewHelper.setTranslationX(right, mTrans);
  331. }
  332. if (left != null) {
  333. left.bringToFront();
  334. }
  335. }
  336. }
  337. private Matrix mMatrix = new Matrix();
  338. private Camera mCamera = new Camera();
  339. private float[] mTempFloat2 = new float[2];
  340. protected float getOffsetXForRotation(float degrees, int width, int height) {
  341. mMatrix.reset();
  342. mCamera.save();
  343. mCamera.rotateY(Math.abs(degrees));
  344. mCamera.getMatrix(mMatrix);
  345. mCamera.restore();
  346. mMatrix.preTranslate(-width * 0.5f, -height * 0.5f);
  347. mMatrix.postTranslate(width * 0.5f, height * 0.5f);
  348. mTempFloat2[0] = width;
  349. mTempFloat2[1] = height;
  350. mMatrix.mapPoints(mTempFloat2);
  351. return (width - mTempFloat2[0]) * (degrees > 0.0f ? 1.0f : -1.0f);
  352. }
  353. protected void animateFade(View left, View right, float positionOffset) {
  354. if (left != null) {
  355. ViewHelper.setAlpha(left, 1 - positionOffset);
  356. }
  357. if (right != null) {
  358. ViewHelper.setAlpha(right, positionOffset);
  359. }
  360. }
  361. protected void animateOutline(View left, View right) {
  362. if (!(left instanceof OutlineContainer))
  363. return;
  364. if (mState != State.IDLE) {
  365. if (left != null) {
  366. ((OutlineContainer) left).setOutlineAlpha(1.0f);
  367. }
  368. if (right != null) {
  369. ((OutlineContainer) right).setOutlineAlpha(1.0f);
  370. }
  371. } else {
  372. if (left != null)
  373. ((OutlineContainer) left).start();
  374. if (right != null)
  375. ((OutlineContainer) right).start();
  376. }
  377. }
  378. @Override
  379. public void onPageScrolled(int position, float positionOffset,
  380. int positionOffsetPixels) {
  381. if (mState == State.IDLE && positionOffset > 0) {
  382. oldPage = getCurrentItem();
  383. mState = position == oldPage ? State.GOING_RIGHT : State.GOING_LEFT;
  384. }
  385. boolean goingRight = position == oldPage;
  386. if (mState == State.GOING_RIGHT && !goingRight)
  387. mState = State.GOING_LEFT;
  388. else if (mState == State.GOING_LEFT && goingRight)
  389. mState = State.GOING_RIGHT;
  390. float effectOffset = isSmall(positionOffset) ? 0 : positionOffset;
  391. // mLeft = getChildAt(position);
  392. // mRight = getChildAt(position+1);
  393. mLeft = findViewFromObject(position);
  394. mRight = findViewFromObject(position + 1);
  395. if (mFadeEnabled)
  396. animateFade(mLeft, mRight, effectOffset);
  397. if (mOutlineEnabled)
  398. animateOutline(mLeft, mRight);
  399. switch (mEffect) {
  400. case Standard:
  401. break;
  402. case Tablet:
  403. animateTablet(mLeft, mRight, effectOffset);
  404. break;
  405. case CubeIn:
  406. animateCube(mLeft, mRight, effectOffset, true);
  407. break;
  408. case CubeOut:
  409. animateCube(mLeft, mRight, effectOffset, false);
  410. break;
  411. case FlipVertical:
  412. animateFlipVertical(mLeft, mRight, positionOffset,
  413. positionOffsetPixels);
  414. break;
  415. case FlipHorizontal:
  416. animateFlipHorizontal(mLeft, mRight, effectOffset,
  417. positionOffsetPixels);
  418. case Stack:
  419. animateStack(mLeft, mRight, effectOffset, positionOffsetPixels);
  420. break;
  421. case ZoomIn:
  422. animateZoom(mLeft, mRight, effectOffset, true);
  423. break;
  424. case ZoomOut:
  425. animateZoom(mLeft, mRight, effectOffset, false);
  426. break;
  427. case RotateUp:
  428. animateRotate(mLeft, mRight, effectOffset, true);
  429. break;
  430. case RotateDown:
  431. animateRotate(mLeft, mRight, effectOffset, false);
  432. break;
  433. case Accordion:
  434. animateAccordion(mLeft, mRight, effectOffset);
  435. break;
  436. }
  437. super.onPageScrolled(position, positionOffset, positionOffsetPixels);
  438. if (effectOffset == 0) {
  439. mState = State.IDLE;
  440. }
  441. }
  442. private boolean isSmall(float positionOffset) {
  443. return Math.abs(positionOffset) < 0.0001;
  444. }
  445. public void setObjectForPosition(Object obj, int position) {
  446. mObjs.put(Integer.valueOf(position), obj);
  447. }
  448. public View findViewFromObject(int position) {
  449. Object o = mObjs.get(Integer.valueOf(position));
  450. if (o == null) {
  451. return null;
  452. }
  453. PagerAdapter a = getAdapter();
  454. View v;
  455. for (int i = 0; i < getChildCount(); i++) {
  456. v = getChildAt(i);
  457. if (a.isViewFromObject(v, o))
  458. return v;
  459. }
  460. return null;
  461. }
  462. }

R.array.jazzy_effects的资源文件:

  1. <string-array name="jazzy_effects">
  2. <item>Standard</item>
  3. <item>Tablet</item>
  4. <item>CubeIn</item>
  5. <item>CubeOut</item>
  6. <item>FlipVertical</item>
  7. <item>FlipHorizontal</item>
  8. <item>Stack</item>
  9. <item>ZoomIn</item>
  10. <item>ZoomOut</item>
  11. <item>RotateUp</item>
  12. <item>RotateDown</item>
  13. <item>Accordion</item>
  14. </string-array>
  15. 现在开始初始化ViewPager:
  16. mHandler = new Handler(getMainLooper())
  17. {
  18. @Override
  19. public void handleMessage(Message msg) {
  20. super.handleMessage(msg);
  21. switch (msg.what) {
  22. case 1:
  23. int index = mViewPager.getCurrentItem();
  24. if (index == mImageUrls.size() - 1) {
  25. index = -1;
  26. }
  27. mViewPager.setCurrentItem(index + 1);
  28. mHandler.sendEmptyMessageDelayed(1,
  29. 3000);
  30. }
  31. }
  32. };
  33. 该mHandler是继承自父类Handler,并且父类并未初始化它,只是做了一个声明,所以我们在onCreate()方法里初始化。但是如果不引用父类的handler的话,ViewPager每次在更换图片的时候就会报错,关于handler没有调用主线程的Looper或者没有调用Looper.parer()等。如果大家今后发现原因请与我分享,谢谢!
  34. 接着我们初始化数据了,就是说你准备在ViewPager里面加载几张照片:
  35. mImageUrl = "drawable://" + R.drawable.image01;
  36. mImageUrls.add(mImageUrl);
  37. mImageUrl = "drawable://" + R.drawable.image02;
  38. mImageUrls.add(mImageUrl);
  39. mImageUrl = "drawable://" + R.drawable.image03;
  40. mImageUrls.add(mImageUrl);
  41. mImageUrl = "drawable://" + R.drawable.image04;
  42. mImageUrls.add(mImageUrl);
  43. 这里要记住,我们在ViewPager里面限定了最多是十二张,所以如果你需要加载的图片超过这个数的话,这里也需要做更改——
  44. public enum TransitionEffect {
  45. Standard, Tablet, CubeIn, CubeOut, FlipVertical, FlipHorizontal, Stack, ZoomIn, ZoomOut, RotateUp, RotateDown, Accordion
  46. //这些都是代表当前的图片是那张
  47. }
  48. 接下来继续初始化ViewPager
  49. mViewPager = (JazzyViewPager)findViewById(R.id.jazzviewpager);
  50. mIndicator = (LinearLayout) findViewById(R.id.index_LinearLayout);
  51. mIndicators = new ImageView[mImageUrls.size()];
  52. if (mImageUrls.size() <= 1) {
  53. mIndicator.setVisibility(View.GONE);
  54. }
  55. for (int i = 0; i < mIndicators.length; i++) {
  56. ImageView imageView = new ImageView(this);
  57. LayoutParams params = new LayoutParams(0,
  58. LayoutParams.WRAP_CONTENT, 1.0f);
  59. if (i != 0) {
  60. params.leftMargin = 5;
  61. }
  62. imageView.setLayoutParams(params);
  63. mIndicators[i] = imageView;
  64. if (i == 0) {
  65. mIndicators[i]
  66. .setBackgroundResource(R.drawable.android_activities_cur);
  67. } else {
  68. mIndicators[i]
  69. .setBackgroundResource(R.drawable.android_activities_bg);
  70. }
  71. mIndicator.addView(imageView);
  72. }
  73. mImageViews = new ImageView[mImageUrls.size()];
  74. for (int i = 0; i < mImageViews.length; i++) {
  75. ImageView imageView = new ImageView(this);
  76. imageView.setScaleType(ScaleType.CENTER_CROP);
  77. mImageViews[i] = imageView;
  78. }
  79. mViewPager.setTransitionEffect(TransitionEffect.CubeOut);
  80. mViewPager.setCurrentItem(0);
  81. mHandler.sendEmptyMessageDelayed(1, 3000);
  82. mViewPager.setAdapter(new MyAdapter());
  83. mViewPager.setOnPageChangeListener(new MyPageChangeListener());
  84. mViewPager.setOnTouchListener(new OnTouchListener() {
  85. @Override
  86. public boolean onTouch(View v, MotionEvent event) {
  87. // TODO Auto-generated method stub
  88. if (mImageUrls.size() == 0 || mImageUrls.size() == 1)
  89. return true;
  90. else
  91. return false;
  92. }
  93. });
  94. /** * 当ViewPager中页面的状态发生改变时调用 * * @author Administrator * */
  95. private class MyPageChangeListener implements OnPageChangeListener {
  96. /** * This method will be invoked when a new page becomes selected. * position: Position index of the new selected page. */
  97. public void onPageSelected(int position) {
  98. setImageBackground(position);
  99. }
  100. public void onPageScrollStateChanged(int arg0) {
  101. }
  102. public void onPageScrolled(int arg0, float arg1, int arg2) {
  103. }
  104. }
  105. /** * 设置选中的tip的背景 * * @param selectItemsIndex */
  106. private void setImageBackground(int selectItemsIndex) {
  107. for (int i = 0; i < mIndicators.length; i++) {
  108. if (i == selectItemsIndex) {
  109. mIndicators[i]
  110. .setBackgroundResource(R.drawable.android_activities_cur);
  111. } else {
  112. mIndicators[i]
  113. .setBackgroundResource(R.drawable.android_activities_bg);
  114. }
  115. }
  116. }
  117. public class MyAdapter extends PagerAdapter {
  118. @Override
  119. public int getCount() {
  120. return mImageViews.length;
  121. }
  122. @Override
  123. public boolean isViewFromObject(View view, Object obj) {
  124. if (view instanceof OutlineContainer) {
  125. return ((OutlineContainer) view).getChildAt(0) == obj;
  126. } else {
  127. return view == obj;
  128. }
  129. }
  130. @Override
  131. public void destroyItem(View container, int position, Object object) {
  132. ((ViewPager) container).removeView(mViewPager
  133. .findViewFromObject(position));
  134. }
  135. @Override
  136. public Object instantiateItem(View container, int position) {
  137. ImageLoader.getInstance().displayImage(mImageUrls.get(position),
  138. mImageViews[position]);
  139. ((ViewPager) container).addView(mImageViews[position], 0);
  140. mViewPager.setObjectForPosition(mImageViews[position], position);
  141. return mImageViews[position];
  142. }
  143. }
  144. 现在ViewPager就初始化好了,接着我们来看看这个Gallery
  145. 首先一样的准备好数据,
  146. mItemData = new IndexGalleryItemData();
  147. mItemData.setId(1);
  148. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_01);
  149. mItemData.setPrice("¥79.00");
  150. mStormListData.add(mItemData);
  151. mItemData = new IndexGalleryItemData();
  152. mItemData.setId(2);
  153. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_02);
  154. mItemData.setPrice("¥89.00");
  155. mStormListData.add(mItemData);
  156. mItemData = new IndexGalleryItemData();
  157. mItemData.setId(3);
  158. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_03);
  159. mItemData.setPrice("¥99.00");
  160. mStormListData.add(mItemData);
  161. mItemData = new IndexGalleryItemData();
  162. mItemData.setId(4);
  163. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_04);
  164. mItemData.setPrice("¥109.00");
  165. mStormListData.add(mItemData);
  166. mItemData = new IndexGalleryItemData();
  167. mItemData.setId(5);
  168. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_05);
  169. mItemData.setPrice("¥119.00");
  170. mStormListData.add(mItemData);
  171. mItemData = new IndexGalleryItemData();
  172. mItemData.setId(6);
  173. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_06);
  174. mItemData.setPrice("¥129.00");
  175. mStormListData.add(mItemData);
  176. mItemData = new IndexGalleryItemData();
  177. mItemData.setId(7);
  178. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_07);
  179. mItemData.setPrice("¥139.00");
  180. mStormListData.add(mItemData);
  181. mItemData = new IndexGalleryItemData();
  182. mItemData.setId(8);
  183. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_08);
  184. mItemData.setPrice("¥69.00");
  185. mPromotionListData.add(mItemData);
  186. mItemData = new IndexGalleryItemData();
  187. mItemData.setId(9);
  188. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_09);
  189. mItemData.setPrice("¥99.00");
  190. mPromotionListData.add(mItemData);
  191. mItemData = new IndexGalleryItemData();
  192. mItemData.setId(10);
  193. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_10);
  194. mItemData.setPrice("¥109.00");
  195. mPromotionListData.add(mItemData);
  196. mItemData = new IndexGalleryItemData();
  197. mItemData.setId(11);
  198. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_11);
  199. mItemData.setPrice("¥119.00");
  200. mPromotionListData.add(mItemData);
  201. mItemData = new IndexGalleryItemData();
  202. mItemData.setId(12);
  203. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_12);
  204. mItemData.setPrice("¥129.00");
  205. mPromotionListData.add(mItemData);
  206. mItemData = new IndexGalleryItemData();
  207. mItemData.setId(13);
  208. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_13);
  209. mItemData.setPrice("¥139.00");
  210. mPromotionListData.add(mItemData);
  211. mItemData = new IndexGalleryItemData();
  212. mItemData.setId(14);
  213. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_14);
  214. mItemData.setPrice("¥149.00");
  215. mPromotionListData.add(mItemData);
  216. 然后初始化控件:
  217. mStormGallery = (Gallery) findViewById(R.id.index_testA_gallery);
  218. mPromotionGallery = (Gallery) findViewById(R.id.index_testB_gallery);
  219. 然后设置Adapter:
  220. mStormAdapter = new IndexGalleryAdapter(this,
  221. R.layout.activity_index_gallery_item, mStormListData,
  222. new int[] { R.id.index_gallery_item_image,
  223. R.id.index_gallery_item_text });
  224. mStormGallery.setAdapter(mStormAdapter);
  225. mPromotionAdapter = new IndexGalleryAdapter(this,
  226. R.layout.activity_index_gallery_item, mPromotionListData,
  227. new int[] { R.id.index_gallery_item_image,
  228. R.id.index_gallery_item_text });
  229. mPromotionGallery.setAdapter(mPromotionAdapter);
  230. mStormGallery.setSelection(3);
  231. mPromotionGallery.setSelection(3);
  232. 这个Adapter也是自定义的,
  233. package com.itau.jingdong.adapter;
  234. import java.util.List;
  235. import android.content.Context;
  236. import android.view.LayoutInflater;
  237. import android.view.View;
  238. import android.view.ViewGroup;
  239. import android.widget.BaseAdapter;
  240. import android.widget.ImageView;
  241. import android.widget.TextView;
  242. import com.itau.jingdong.entity.IndexGalleryItemData;
  243. import com.nostra13.universalimageloader.core.ImageLoader;
  244. public class IndexGalleryAdapter extends BaseAdapter {
  245. Context context;
  246. int layoutId;
  247. int to[];
  248. List<IndexGalleryItemData> listData;
  249. public IndexGalleryAdapter(Context context, int layoutId,
  250. List<IndexGalleryItemData> listData, int to[]) {
  251. this.context = context;
  252. this.layoutId = layoutId;
  253. this.listData = listData;
  254. this.to = to;
  255. }
  256. @Override
  257. public int getCount() {
  258. // TODO Auto-generated method stub
  259. return listData.size() == 0 ? 0 : listData.size();
  260. }
  261. @Override
  262. public Object getItem(int position) {
  263. // TODO Auto-generated method stub
  264. return listData.get(position);
  265. }
  266. @Override
  267. public long getItemId(int position) {
  268. // TODO Auto-generated method stub
  269. return position;
  270. }
  271. @Override
  272. public View getView(int position, View convertView, ViewGroup parent) {
  273. // TODO Auto-generated method stub
  274. ViewHolder viewHolder;
  275. final int pos = position;
  276. if (convertView == null) {
  277. LayoutInflater inflater = (LayoutInflater) context
  278. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  279. convertView = inflater.inflate(layoutId, parent, false);
  280. viewHolder = new ViewHolder();
  281. viewHolder.imageView = (ImageView) convertView.findViewById(to[0]);
  282. viewHolder.textView = (TextView) convertView.findViewById(to[1]);
  283. convertView.setTag(viewHolder);
  284. } else {
  285. viewHolder = (ViewHolder) convertView.getTag();
  286. resetViewHolder(viewHolder);
  287. }
  288. ImageLoader.getInstance().displayImage(listData.get(pos).getImageUrl(),
  289. viewHolder.imageView);
  290. viewHolder.textView.setText(listData.get(pos).getPrice());
  291. return convertView;
  292. }
  293. static class ViewHolder {
  294. ImageView imageView;
  295. TextView textView;
  296. }
  297. protected void resetViewHolder(ViewHolder viewHolder) {
  298. viewHolder.imageView.setImageBitmap(null);
  299. viewHolder.textView.setText("");
  300. }
  301. }

后这样就可以实现我们要的效果了!
这里写图片描述
关于ViewPager里面图片自动播放的时候动画可以自己在自定义ViewPager里面更改
最后贴上java全部代码:

  1. package com.itau.jingdong;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import com.itau.jingdong.adapter.IndexGalleryAdapter;
  5. import com.itau.jingdong.entity.IndexGalleryItemData;
  6. import com.itau.jingdong.ui.base.BaseActivity;
  7. import com.itau.jingdong.widgets.jazzviewpager.JazzyViewPager;
  8. import com.itau.jingdong.widgets.jazzviewpager.JazzyViewPager.TransitionEffect;
  9. import com.itau.jingdong.widgets.jazzviewpager.OutlineContainer;
  10. import com.nostra13.universalimageloader.core.ImageLoader;
  11. import android.os.Bundle;
  12. import android.os.Handler;
  13. import android.os.Message;
  14. import android.support.v4.view.PagerAdapter;
  15. import android.support.v4.view.ViewPager;
  16. import android.support.v4.view.ViewPager.OnPageChangeListener;
  17. import android.util.Log;
  18. import android.view.MotionEvent;
  19. import android.view.View;
  20. import android.view.View.OnTouchListener;
  21. import android.widget.Gallery;
  22. import android.widget.ImageView;
  23. import android.widget.ImageView.ScaleType;
  24. import android.widget.LinearLayout;
  25. import android.widget.LinearLayout.LayoutParams;
  26. public class TestActivity extends BaseActivity {
  27. private JazzyViewPager mViewPager;
  28. private LinearLayout mIndicator;
  29. private List<String> mImageUrls = new ArrayList<String>();
  30. private String mImageUrl = null;
  31. /** * 装指引的ImageView数组 */
  32. private ImageView[] mIndicators;
  33. /** * 装ViewPager中ImageView的数组 */
  34. private ImageView[] mImageViews;
  35. // ============== 广告切换 ===================
  36. private Gallery mStormGallery = null;
  37. private Gallery mPromotionGallery = null;
  38. private IndexGalleryAdapter mStormAdapter = null;
  39. private IndexGalleryAdapter mPromotionAdapter = null;
  40. private List<IndexGalleryItemData> mStormListData = new ArrayList<IndexGalleryItemData>();
  41. private List<IndexGalleryItemData> mPromotionListData = new ArrayList<IndexGalleryItemData>();
  42. private IndexGalleryItemData mItemData = null;
  43. @Override
  44. protected void onCreate(Bundle savedInstanceState) {
  45. super.onCreate(savedInstanceState);
  46. setContentView(R.layout.activity_test);
  47. mHandler = new Handler(getMainLooper())
  48. {
  49. @Override
  50. public void handleMessage(Message msg) {
  51. super.handleMessage(msg);
  52. switch (msg.what) {
  53. case 1:
  54. int index = mViewPager.getCurrentItem();
  55. if (index == mImageUrls.size() - 1) {
  56. index = -1;
  57. }
  58. mViewPager.setCurrentItem(index + 1);
  59. mHandler.sendEmptyMessageDelayed(1,
  60. 3000);
  61. }
  62. }
  63. };
  64. initData();
  65. mViewPager = (JazzyViewPager)findViewById(R.id.jazzviewpager);
  66. mIndicator = (LinearLayout) findViewById(R.id.index_LinearLayout);
  67. mStormGallery = (Gallery) findViewById(R.id.index_testA_gallery);
  68. mPromotionGallery = (Gallery) findViewById(R.id.index_testB_gallery);
  69. mIndicators = new ImageView[mImageUrls.size()];
  70. if (mImageUrls.size() <= 1) {
  71. mIndicator.setVisibility(View.GONE);
  72. }
  73. for (int i = 0; i < mIndicators.length; i++) {
  74. ImageView imageView = new ImageView(this);
  75. LayoutParams params = new LayoutParams(0,
  76. LayoutParams.WRAP_CONTENT, 1.0f);
  77. if (i != 0) {
  78. params.leftMargin = 5;
  79. }
  80. imageView.setLayoutParams(params);
  81. mIndicators[i] = imageView;
  82. if (i == 0) {
  83. mIndicators[i]
  84. .setBackgroundResource(R.drawable.android_activities_cur);
  85. } else {
  86. mIndicators[i]
  87. .setBackgroundResource(R.drawable.android_activities_bg);
  88. }
  89. mIndicator.addView(imageView);
  90. }
  91. mImageViews = new ImageView[mImageUrls.size()];
  92. for (int i = 0; i < mImageViews.length; i++) {
  93. ImageView imageView = new ImageView(this);
  94. imageView.setScaleType(ScaleType.CENTER_CROP);
  95. mImageViews[i] = imageView;
  96. }
  97. mViewPager.setTransitionEffect(TransitionEffect.CubeOut);
  98. mViewPager.setCurrentItem(0);
  99. mHandler.sendEmptyMessageDelayed(1, 3000);
  100. mViewPager.setAdapter(new MyAdapter());
  101. mViewPager.setOnPageChangeListener(new MyPageChangeListener());
  102. mViewPager.setOnTouchListener(new OnTouchListener() {
  103. @Override
  104. public boolean onTouch(View v, MotionEvent event) {
  105. // TODO Auto-generated method stub
  106. if (mImageUrls.size() == 0 || mImageUrls.size() == 1)
  107. return true;
  108. else
  109. return false;
  110. }
  111. });
  112. mStormAdapter = new IndexGalleryAdapter(this,
  113. R.layout.activity_index_gallery_item, mStormListData,
  114. new int[] { R.id.index_gallery_item_image,
  115. R.id.index_gallery_item_text });
  116. mStormGallery.setAdapter(mStormAdapter);
  117. mPromotionAdapter = new IndexGalleryAdapter(this,
  118. R.layout.activity_index_gallery_item, mPromotionListData,
  119. new int[] { R.id.index_gallery_item_image,
  120. R.id.index_gallery_item_text });
  121. mPromotionGallery.setAdapter(mPromotionAdapter);
  122. mStormGallery.setSelection(3);
  123. mPromotionGallery.setSelection(3);
  124. }
  125. private void initData() {
  126. mImageUrl = "drawable://" + R.drawable.image01;
  127. mImageUrls.add(mImageUrl);
  128. mImageUrl = "drawable://" + R.drawable.image02;
  129. mImageUrls.add(mImageUrl);
  130. mImageUrl = "drawable://" + R.drawable.image03;
  131. mImageUrls.add(mImageUrl);
  132. mImageUrl = "drawable://" + R.drawable.image04;
  133. mImageUrls.add(mImageUrl);
  134. // mImageUrl = "drawable://" + R.drawable.image05;
  135. // mImageUrls.add(mImageUrl);
  136. //
  137. // mImageUrl = "drawable://" + R.drawable.image06;
  138. // mImageUrls.add(mImageUrl);
  139. //
  140. // mImageUrl = "drawable://" + R.drawable.image07;
  141. // mImageUrls.add(mImageUrl);
  142. //
  143. // mImageUrl = "drawable://" + R.drawable.image08;
  144. // mImageUrls.add(mImageUrl);
  145. mItemData = new IndexGalleryItemData();
  146. mItemData.setId(1);
  147. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_01);
  148. mItemData.setPrice("¥79.00");
  149. mStormListData.add(mItemData);
  150. mItemData = new IndexGalleryItemData();
  151. mItemData.setId(2);
  152. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_02);
  153. mItemData.setPrice("¥89.00");
  154. mStormListData.add(mItemData);
  155. mItemData = new IndexGalleryItemData();
  156. mItemData.setId(3);
  157. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_03);
  158. mItemData.setPrice("¥99.00");
  159. mStormListData.add(mItemData);
  160. mItemData = new IndexGalleryItemData();
  161. mItemData.setId(4);
  162. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_04);
  163. mItemData.setPrice("¥109.00");
  164. mStormListData.add(mItemData);
  165. mItemData = new IndexGalleryItemData();
  166. mItemData.setId(5);
  167. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_05);
  168. mItemData.setPrice("¥119.00");
  169. mStormListData.add(mItemData);
  170. mItemData = new IndexGalleryItemData();
  171. mItemData.setId(6);
  172. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_06);
  173. mItemData.setPrice("¥129.00");
  174. mStormListData.add(mItemData);
  175. mItemData = new IndexGalleryItemData();
  176. mItemData.setId(7);
  177. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_07);
  178. mItemData.setPrice("¥139.00");
  179. mStormListData.add(mItemData);
  180. mItemData = new IndexGalleryItemData();
  181. mItemData.setId(8);
  182. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_08);
  183. mItemData.setPrice("¥69.00");
  184. mPromotionListData.add(mItemData);
  185. mItemData = new IndexGalleryItemData();
  186. mItemData.setId(9);
  187. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_09);
  188. mItemData.setPrice("¥99.00");
  189. mPromotionListData.add(mItemData);
  190. mItemData = new IndexGalleryItemData();
  191. mItemData.setId(10);
  192. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_10);
  193. mItemData.setPrice("¥109.00");
  194. mPromotionListData.add(mItemData);
  195. mItemData = new IndexGalleryItemData();
  196. mItemData.setId(11);
  197. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_11);
  198. mItemData.setPrice("¥119.00");
  199. mPromotionListData.add(mItemData);
  200. mItemData = new IndexGalleryItemData();
  201. mItemData.setId(12);
  202. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_12);
  203. mItemData.setPrice("¥129.00");
  204. mPromotionListData.add(mItemData);
  205. mItemData = new IndexGalleryItemData();
  206. mItemData.setId(13);
  207. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_13);
  208. mItemData.setPrice("¥139.00");
  209. mPromotionListData.add(mItemData);
  210. mItemData = new IndexGalleryItemData();
  211. mItemData.setId(14);
  212. mItemData.setImageUrl("drawable://" + R.drawable.index_gallery_14);
  213. mItemData.setPrice("¥149.00");
  214. mPromotionListData.add(mItemData);
  215. }
  216. /** * 当ViewPager中页面的状态发生改变时调用 * * @author Administrator * */
  217. private class MyPageChangeListener implements OnPageChangeListener {
  218. /** * This method will be invoked when a new page becomes selected. * position: Position index of the new selected page. */
  219. public void onPageSelected(int position) {
  220. setImageBackground(position);
  221. }
  222. public void onPageScrollStateChanged(int arg0) {
  223. }
  224. public void onPageScrolled(int arg0, float arg1, int arg2) {
  225. }
  226. }
  227. /** * 设置选中的tip的背景 * * @param selectItemsIndex */
  228. private void setImageBackground(int selectItemsIndex) {
  229. for (int i = 0; i < mIndicators.length; i++) {
  230. if (i == selectItemsIndex) {
  231. mIndicators[i]
  232. .setBackgroundResource(R.drawable.android_activities_cur);
  233. } else {
  234. mIndicators[i]
  235. .setBackgroundResource(R.drawable.android_activities_bg);
  236. }
  237. }
  238. }
  239. public class MyAdapter extends PagerAdapter {
  240. @Override
  241. public int getCount() {
  242. return mImageViews.length;
  243. }
  244. @Override
  245. public boolean isViewFromObject(View view, Object obj) {
  246. if (view instanceof OutlineContainer) {
  247. return ((OutlineContainer) view).getChildAt(0) == obj;
  248. } else {
  249. return view == obj;
  250. }
  251. }
  252. @Override
  253. public void destroyItem(View container, int position, Object object) {
  254. ((ViewPager) container).removeView(mViewPager
  255. .findViewFromObject(position));
  256. }
  257. @Override
  258. public Object instantiateItem(View container, int position) {
  259. ImageLoader.getInstance().displayImage(mImageUrls.get(position),
  260. mImageViews[position]);
  261. ((ViewPager) container).addView(mImageViews[position], 0);
  262. mViewPager.setObjectForPosition(mImageViews[position], position);
  263. return mImageViews[position];
  264. }
  265. }
  266. @Override
  267. protected void findViewById() {
  268. // TODO Auto-generated method stub
  269. }
  270. @Override
  271. protected void initView() {
  272. // TODO Auto-generated method stub
  273. }
  274. }

布局文件:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.itau.jingdong.TestActivity" >
  2. <com.itau.jingdong.widgets.jazzviewpager.JazzyViewPager android:id="@+id/jazzviewpager" android:layout_width="match_parent" android:layout_height="300dp" android:background="@color/white" />
  3. <LinearLayout android:id="@+id/index_LinearLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white" android:orientation="horizontal" />
  4. <Gallery android:id="@+id/index_testA_gallery" android:layout_width="match_parent" android:layout_height="@dimen/index_gallery_height" android:layout_marginBottom="15dp" android:spacing="10dp" />
  5. <Gallery android:id="@+id/index_testB_gallery" android:layout_width="match_parent" android:layout_height="@dimen/index_gallery_height" android:layout_marginBottom="35dp" android:spacing="10dp" />
  6. </LinearLayout>

发表评论

表情:
评论列表 (有 0 条评论,251人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android——仿京东秒杀

    效果图: ![Center][] 京东秒杀是两个小时一个场次,判断本机的时间进行场次定时,然后在这两个小时里面进行倒计时。 MainActivity   im

    相关 js 仿京东放大镜

    功能模块 1. 整个案例可以分为三个功能模块 2. 鼠标经过小图片盒子, 黄色的遮挡层 和 大图片盒子显示,离开隐藏2个盒子功能 3. 黄色的遮挡层跟随鼠标功能。 4.