最近在研究如何做出仿微信,仿新浪等应用,第一次安装使用的使用展示应用程序的新特性和用法。

实现功能:左右手势滑屏

底部小圆点随当前显示页跳动

浮动按钮显示。当触屏事件发生显示,否则就渐渐消失

先转个文章:http://blog.csdn.net/feng88724/article/details/6973662

第一种: ViewFlipper + GestureDetector

第二种: ActivityGroup +   GestureDetector

第三种: ViewPager  (Android3.0+)

第四种: ViewFlow (开源项目)

话不多说,先放上效果图

向右滑动,或者点击按钮向右

怎么样,是不是很心动~~~!哈哈、

实现左右滑屏是需要一个叫做ViewPager的东西。具体ViewPager怎么用我就不赘述了。(PS注意导入ViewPager的兼容包)

接下来是代码:

首先在main.xml中声明ViewPager:

[html] view
plain
copy

  1. <LinearLayout
  2. android:id="@+id/linearLayout01"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical" >
  6. <android.support.v4.view.ViewPager
  7. android:id="@+id/guidePages"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"/>
  10. lt;/LinearLayout>
[html] view
plain
copy

  1. 和一个viewGroup放小圆点
[html] view
plain
copy

  1. <LinearLayout
  2. android:id="@+id/viewGroup"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:layout_alignParentBottom="true"
  6. android:layout_marginBottom="40dp"
  7. android:gravity="center_horizontal"
  8. android:orientation="horizontal" >
  9. </LinearLayout>

接着在item01.xml等几个xml中放置要显示的图片,因为几个都一样,就不都贴上来了。

[html] view
plain
copy

  1. <ImageView
  2. android:layout_width="fill_parent"
  3. android:layout_height="fill_parent"
  4. android:background="@drawable/feature_guide_0" >
  5. </ImageView>

接下来是核心代码:

[java] view
plain
copy

  1. public class GuideViewActivity extends Activity {
  2. private ViewPager viewPager;
  3. private ArrayList<View> pageViews;
  4. private ImageView imageView;
  5. private ImageView[] imageViews;
  6. // 包裹滑动图片LinearLayout
  7. private ViewGroup main;
  8. // 包裹小圆点的LinearLayout
  9. private ViewGroup group;
  10. //左箭头按钮
  11. private ImageView imageViewLeft;
  12. //右箭头按钮
  13. private ImageView imageViewRight;
  14. //当前页码
  15. private int currentIndex;
  16. //ImageView的alpha值
  17. private int mAlpha = 0;
  18. private boolean isHide;
  19. /** Called when the activity is first created. */
  20. @Override
  21. public void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. //将要显示的图片放到ArrayList当中,存到适配器中
  24. LayoutInflater inflater = getLayoutInflater();
  25. pageViews = new ArrayList<View>();
  26. pageViews.add(inflater.inflate(R.layout.item01, null));
[java] view
plain
copy

  1. ...
[java] view
plain
copy

  1. imageViews = new ImageView[pageViews.size()];
  2. main = (ViewGroup)inflater.inflate(R.layout.main, null);
  3. group = (ViewGroup)main.findViewById(R.id.viewGroup);
  4. viewPager = (ViewPager)main.findViewById(R.id.guidePages);
  5. imageViewLeft = (ImageView)main.findViewById(R.id.imageView1);
  6. imageViewRight = (ImageView)main.findViewById(R.id.imageView2);
  7. imageViewLeft.setAlpha(0);
  8. imageViewRight.setAlpha(0);
  9. //将小圆点放到imageView数组当中
  10. for (int i = 0; i < pageViews.size(); i++) {
  11. imageView = new ImageView(GuideViewActivity.this);
  12. imageView.setLayoutParams(new LayoutParams(20,20));
  13. imageView.setPadding(20, 0, 20, 0);
  14. imageViews[i] = imageView;
  15. if (i == 0) {
  16. //默认选中第一张图片
  17. imageViews[i].setBackgroundResource(R.drawable.page_indicator_focused);
  18. } else {
  19. imageViews[i].setBackgroundResource(R.drawable.page_indicator);
  20. }
  21. group.addView(imageViews[i]);
  22. }
  23. setContentView(main);
  24. viewPager.setAdapter(new GuidePageAdapter());
  25. viewPager.setOnPageChangeListener(new GuidePageChangeListener());
  26. imageViewLeft.setOnClickListener(new ButtonListener());
  27. imageViewRight.setOnClickListener(new ButtonListener());
  28. }
  29. //左右切换屏幕的按钮监听器
  30. class ButtonListener implements OnClickListener{
  31. @Override
  32. public void onClick(View v) {
  33. // TODO Auto-generated method stub
  34. int showNext=0;
  35. if(v.getId() == R.id.imageView1) {
  36. System.out.println("点击了向左的按钮");
  37. if(currentIndex ==0 )
  38. showNext = currentIndex;
  39. else
  40. showNext = currentIndex-1;
  41. viewPager.setCurrentItem(showNext);
  42. }
  43. if(v.getId() == R.id.imageView2){
  44. System.out.println("点击了向右的按钮");
  45. if(currentIndex == imageViews.length)
  46. showNext = currentIndex;
  47. else
  48. showNext = currentIndex+1;
  49. viewPager.setCurrentItem(showNext);
  50. }
  51. System.out.println("当前页码:"+showNext);
  52. }
  53. }
  54. /**
  55. * 设置按钮渐显效果
  56. */
  57. private Handler mHandler = new Handler()
  58. {
  59. public void handleMessage(Message msg) {
  60. if(msg.what==1 && mAlpha<255){
  61. //通过设置不透明度设置按钮的渐显效果
  62. mAlpha += 50;
  63. if(mAlpha>255)
  64. mAlpha=255;
  65. imageViewLeft.setAlpha(mAlpha);
  66. imageViewLeft.invalidate();
  67. imageViewRight.setAlpha(mAlpha);
  68. imageViewRight.invalidate();
  69. if(!isHide && mAlpha<255)
  70. mHandler.sendEmptyMessageDelayed(1, 100);
  71. }else if(msg.what==0 && mAlpha>0){
  72. mAlpha -= 3;
  73. if(mAlpha<0)
  74. mAlpha=0;
  75. imageViewLeft.setAlpha(mAlpha);
  76. imageViewLeft.invalidate();
  77. imageViewRight.setAlpha(mAlpha);
  78. imageViewRight.invalidate();
  79. if(isHide && mAlpha>0)
  80. mHandler.sendEmptyMessageDelayed(0, 2);
  81. }
  82. }
  83. };
  84. private void showImageButtonView(){
  85. isHide = false;
  86. mHandler.sendEmptyMessage(1);
  87. }
  88. private void hideImageButtonView(){
  89. new Thread(){
  90. public void run() {
  91. try {
  92. isHide = true;
  93. mHandler.sendEmptyMessage(0);
  94. } catch (Exception e) {
  95. ;
  96. }
  97. }
  98. }.start();
  99. }
  100. @Override
  101. public boolean dispatchTouchEvent(MotionEvent ev) {
  102. System.out.println("this is dispatch");
  103. System.out.println("触碰屏幕");
  104. switch (ev.getAction()) {
  105. case MotionEvent.ACTION_MOVE:
  106. case MotionEvent.ACTION_DOWN:
  107. showImageButtonView();
  108. break;
  109. case MotionEvent.ACTION_UP:
  110. hideImageButtonView();
  111. break;
  112. }
  113. return super.dispatchTouchEvent(ev);
  114. }
  115. // 指引页面数据适配器,实现适配器方法
  116. class GuidePageAdapter extends PagerAdapter {
  117. @Override
  118. public int getCount() {
  119. return pageViews.size();
  120. }
  121. @Override
  122. public boolean isViewFromObject(View arg0, Object arg1) {
  123. return arg0 == arg1;
  124. }
  125. @Override
  126. public int getItemPosition(Object object) {
  127. // TODO Auto-generated method stub
  128. return super.getItemPosition(object);
  129. }
  130. @Override
  131. public void destroyItem(View arg0, int arg1, Object arg2) {
  132. // TODO Auto-generated method stub
  133. ((ViewPager) arg0).removeView(pageViews.get(arg1));
  134. }
  135. @Override
  136. public Object instantiateItem(View arg0, int arg1) {
  137. // TODO Auto-generated method stub
  138. ((ViewPager) arg0).addView(pageViews.get(arg1));
  139. return pageViews.get(arg1);
  140. }
  141. @Override
  142. public void restoreState(Parcelable arg0, ClassLoader arg1) {
  143. // TODO Auto-generated method stub
  144. }
  145. @Override
  146. public Parcelable saveState() {
  147. // TODO Auto-generated method stub
  148. return null;
  149. }
  150. @Override
  151. public void startUpdate(View arg0) {
  152. // TODO Auto-generated method stub
  153. }
  154. @Override
  155. public void finishUpdate(View arg0) {
  156. // TODO Auto-generated method stub
  157. }
  158. }
  159. // 指引页面更改事件监听器,左右滑动图片时候,小圆点变换显示当前图片位置
  160. class GuidePageChangeListener implements OnPageChangeListener {
  161. @Override
  162. public void onPageScrollStateChanged(int arg0) {
  163. // TODO Auto-generated method stub
  164. }
  165. @Override
  166. public void onPageScrolled(int arg0, float arg1, int arg2) {
  167. // TODO Auto-generated method stub
  168. }
  169. @Override
  170. public void onPageSelected(int arg0) {
  171. currentIndex = arg0;
  172. for (int i = 0; i < imageViews.length; i++) {
  173. imageViews[arg0].setBackgroundResource(R.drawable.page_indicator_focused);
  174. if (arg0 != i) {
  175. imageViews[i].setBackgroundResource(R.drawable.page_indicator);
  176. }
  177. }
  178. }
  179. }

啊~到这里就都实现了~

最新文章

  1. C#程序以管理员权限运行
  2. LUA表克隆方法归纳
  3. 不可或缺 Windows Native (1) - C 语言: hello c
  4. Struts1与Struts2的12点区别
  5. iOS - Notification 通知
  6. 优化DB2缓冲页的大小
  7. Android(java)学习笔记68:同步代码块 和 同步方法 的应用
  8. CSS选择器,标签限定
  9. AI 人工智能 探索 (七)
  10. TDD实践感悟
  11. Spring Cloud下基于OAUTH2认证授权的实现
  12. POJ 1988 Cube Stacking 【带权并查集】
  13. linux c++ curl 根据IP地址获得当前网络的所在的地理位置
  14. ArrayUtil的创建和使用
  15. Python中的正则表达式(re)
  16. laravel 开启sql调试
  17. DLL接口的实现(虚函数)
  18. 5.Struts2配置形式,覆盖
  19. centos6安装最新syslog-ng推送hdfs
  20. 使用 Idea 打 scala程序的 jar 包 - 02

热门文章

  1. J实现时间格式的转换(附加对象的转换)
  2. Webpack学习手册
  3. 6.3 Android硬件访问服务APP代码
  4. BZOJ 2245 SDOI 2011 工作安排 费用流
  5. 最正经的php post get
  6. POJ 2823 Sliding Window 线段树
  7. 【Codeforces Round #439 (Div. 2) C】The Intriguing Obsession
  8. thinkphp5 tp5 七牛云 上传图片
  9. AngularJS之ng-options指令
  10. ZOJ 3168 Sort ZOJ7 水