本文实例讲述了Android开发实现高仿优酷的客户端图片左右滑动切换功能。分享给大家供大家参考,具体如下:

本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和门户网站都有类似的实现:

具体思路:

1. 工程中需要添加android-support-v4.jar,才能使用ViewPager控件.

2. 图片的自动切换: 可使用Timer或者ScheduledExecutorService,这个有多重方式可以实现.

同时要切换底部的dots(园点)

3.Handler+Message机制更新UI,这个相信大家都很熟练,不再描述

4. 实现的一些细节:注意本例中的优化:图片的自动切换启动了其他的线程,要在Activity在可见到不可见的状态,也就是在onStop()方法中将线程停止,在onStart()方法中开启线程。否则,Timer没有停止,或者反复开启,会引起较大的内存消耗,时间一长就程序就会崩掉。 还有,就是在跳转到其他Activity的过程中会出现画面的卡顿

下面看一下效果图和具体代码:

工程结构如下图所示:

main.xml:

然后是具体的布局文件及代码实现:

main.xml:

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#FFFFFF"

android:orientation="vertical" >

android:layout_width="fill_parent"

android:layout_height="40dip"

android:background="@drawable/title_bk" >

android:id="@+id/btn_back"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/btn_back_selector"

android:src="@drawable/btn_back" />

android:id="@+id/line0"

android:layout_width="1px"

android:layout_height="fill_parent"

android:layout_toRightOf="@id/btn_back"

android:background="#aa11264f" />

android:layout_width="1px"

android:layout_height="fill_parent"

android:layout_toRightOf="@id/line0"

android:background="#009ad6" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:text="优酷客户端"

android:textColor="#FFFFFF"

android:textSize="20sp" />

android:layout_width="fill_parent"

android:layout_height="140dip" >

android:id="@+id/vp"

android:layout_width="fill_parent"

android:layout_height="fill_parent" />

android:layout_width="fill_parent"

android:layout_height="35dip"

android:layout_gravity="bottom"

android:background="#33000000"

android:gravity="center"

android:orientation="vertical" >

android:id="@+id/tv_title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="中国家庭院校园区域名字体现"

android:textColor="#ffffff" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="3dip"

android:gravity="center" >

android:id="@+id/v_dot0"

style="@style/dot_style"

android:background="@drawable/dot_focused" />

android:id="@+id/v_dot1"

style="@style/dot_style" />

android:id="@+id/v_dot2"

style="@style/dot_style" />

android:id="@+id/v_dot3"

style="@style/dot_style" />

android:id="@+id/v_dot4"

style="@style/dot_style" />

MyViewPagerActivity:

package com.tony.viewpager;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Parcelable;

import android.support.v4.view.PagerAdapter;

import android.support.v4.view.ViewPager;

import android.support.v4.view.ViewPager.OnPageChangeListener;

import android.view.View;

import android.widget.ImageView;

import android.widget.ImageView.ScaleType;

import android.widget.TextView;

/**

* 仿优酷Android客户端图片左右滑动

*

*/

public class MyViewPagerActivity extends Activity {

private ViewPager viewPager; // android-support-v4中的滑动组件

private List imageViews; // 滑动的图片集合

private String[] titles; // 图片标题

private int[] imageResId; // 图片ID

private List dots; // 图片标题正文的那些点

private TextView tv_title;

private int currentItem = 0; // 当前图片的索引号

// An ExecutorService that can schedule commands to run after a given delay,

// or to execute periodically.

private ScheduledExecutorService scheduledExecutorService;

// 切换当前显示的图片

private Handler handler = new Handler() {

public void handleMessage(android.os.Message msg) {

viewPager.setCurrentItem(currentItem);// 切换当前显示的图片

};

};

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

imageResId = new int[] { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e };

titles = new String[imageResId.length];

titles[0] = "巩俐不低俗,我就不能低俗";

titles[1] = "扑树又回来啦!再唱经典老歌引万人大合唱";

titles[2] = "揭秘北京电影如何升级";

titles[3] = "乐视网TV版大派送";

titles[4] = "热血屌丝的反杀";

imageViews = new ArrayList();

// 初始化图片资源

for (int i = 0; i < imageResId.length; i++) {

ImageView imageView = new ImageView(this);

imageView.setImageResource(imageResId[i]);

imageView.setScaleType(ScaleType.CENTER_CROP);

imageViews.add(imageView);

}

dots = new ArrayList();

dots.add(findViewById(R.id.v_dot0));

dots.add(findViewById(R.id.v_dot1));

dots.add(findViewById(R.id.v_dot2));

dots.add(findViewById(R.id.v_dot3));

dots.add(findViewById(R.id.v_dot4));

tv_title = (TextView) findViewById(R.id.tv_title);

tv_title.setText(titles[0]);//

viewPager = (ViewPager) findViewById(R.id.vp);

viewPager.setAdapter(new MyAdapter());// 设置填充ViewPager页面的适配器

// 设置一个监听器,当ViewPager中的页面改变时调用

viewPager.setOnPageChangeListener(new MyPageChangeListener());

}

@Override

protected void onStart() {

scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();

// 当Activity显示出来后,每两秒钟切换一次图片显示

scheduledExecutorService.scheduleAtFixedRate(new ScrollTask(), 1, 2, TimeUnit.SECONDS);

super.onStart();

}

@Override

protected void onStop() {

// 当Activity不可见的时候停止切换

scheduledExecutorService.shutdown();

super.onStop();

}

/**

* 换行切换任务

*

* @author Administrator

*

*/

private class ScrollTask implements Runnable {

public void run() {

synchronized (viewPager) {

System.out.println("currentItem: " + currentItem);

currentItem = (currentItem + 1) % imageViews.size();

handler.obtainMessage().sendToTarget(); // 通过Handler切换图片

}

}

}

/**

* 当ViewPager中页面的状态发生改变时调用

*

* @author Administrator

*

*/

private class MyPageChangeListener implements OnPageChangeListener {

private int oldPosition = 0;

/**

* This method will be invoked when a new page becomes selected.

* position: Position index of the new selected page.

*/

public void onPageSelected(int position) {

currentItem = position;

tv_title.setText(titles[position]);

dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);

dots.get(position).setBackgroundResource(R.drawable.dot_focused);

oldPosition = position;

}

public void onPageScrollStateChanged(int arg0) {

}

public void onPageScrolled(int arg0, float arg1, int arg2) {

}

}

/**

* 填充ViewPager页面的适配器

*

* @author Administrator

*

*/

private class MyAdapter extends PagerAdapter {

@Override

public int getCount() {

return imageResId.length;

}

@Override

public Object instantiateItem(View arg0, int arg1) {

((ViewPager) arg0).addView(imageViews.get(arg1));

return imageViews.get(arg1);

}

@Override

public void destroyItem(View arg0, int arg1, Object arg2) {

((ViewPager) arg0).removeView((View) arg2);

}

@Override

public boolean isViewFromObject(View arg0, Object arg1) {

return arg0 == arg1;

}

@Override

public void restoreState(Parcelable arg0, ClassLoader arg1) {

}

@Override

public Parcelable saveState() {

return null;

}

@Override

public void startUpdate(View arg0) {

}

@Override

public void finishUpdate(View arg0) {

}

}

}

Drawable目录下

btn_back_selector.xml:

btn_top_pressed.xml:

android:shape="rectangle" >

android:angle="270"

android:endColor="#009ad6"

android:startColor="#11264f" />

dot_focused.xml:

android:shape="oval" >

dot_normal.xml:

android:shape="oval" >

title_bk.xml:

android:shape="rectangle" >

android:angle="270"

android:endColor="#11264f"

android:startColor="#009ad6" />

完整源码点击此处本站下载。

希望本文所述对大家Android程序设计有所帮助。

android仿疯狂猜图源码,Android开发实现高仿优酷的客户端图片左右滑动切换功能实例【附源码下载】...相关推荐

  1. Android开发之高仿QQ消息侧拉删除

    Android开发之高仿QQ消息侧拉删除 QQ消息的侧滑删除效果之炫酷,想必大家都见过吧,本人作为一名安卓开发人员,遇到如此炫酷的效果,怎能不研究一番呢,现本人已实现其基本功能,现将代码贴出,望各位大 ...

  2. android 微博字体高亮,安卓开发札记——高仿新浪微博文字处理(实现关键字高亮,自定义表情替换并加入点击事件实现)...

    安卓开发笔记--高仿新浪微博文字处理(实现关键字高亮,自定义表情替换并加入点击事件实现) 先让大家看下效果图,这个是我自己在闲暇时间仿写的新浪微博客户端: 今天来讲讲如何实现上图的效果,这里需要用到S ...

  3. C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码...

    C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码 原文:C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码 前言 系列 ...

  4. C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码

    我记得,之前在写安卓方面的文章的时候,有人就问过我.Xamarin.Android为什么打包出来这么大?随便一个HelloWord就20-30MB? 嗯..今天我们就来解决这个问题.. 我们先从指定一 ...

  5. 高仿优酷Android客户端图片左右滑动(自动切换)

    本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和门户网站都有类似的实现: 具体思路: 1. 工程中需要添加android-support-v4.jar,才能 ...

  6. C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码...

    原文:C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github. ...

  7. C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码

    本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要.. 想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈... 今天的学习内容? ...

  8. C#使用Xamarin开发可移植移动应用进阶篇(6.使用渲染器针对单个平台自定义控件),附源码

    本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要.. 想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈... 今天的学习内容? ...

  9. 婚恋交友源码开发,实现图片的滑动切换

    前言 我们开始来介绍实现婚恋交友源码转换类的动画组件,实际上这类转换动画组件也可以自己通过 AnimatedBuilder 或 AnimatedWidget 完成, Flutter 为了简化开发,提供 ...

最新文章

  1. 大话IT职场之办公室环境重要吗?
  2. 三款功能强大代码比较工具Beyond compare、DiffMerge、WinMerge
  3. linux 服务器安装mysql5.6
  4. Aidl进程间通信详细介绍
  5. idea 单独引入jar_Intellij IDEA 添加jar包的三种方式
  6. java定时任务管理_基于SpringBoot+layui秒级定时任务管理:JTimer for JAVA项目
  7. 什么值得买发布年货消费报告 预制菜GMV同比增长39.41%
  8. React Echarts 点击事件
  9. 20、自动装配-@Autowired@Qualifier@Primary
  10. 9、1.4.1 JDK下载与安装
  11. 最新微信开通状态过滤程序
  12. SEO优化怎么做,怎么做SEO优化
  13. 【自然语言处理】【多模态】OFA:通过简单的sequence-to-sequence学习框架统一架构、任务和模态
  14. 基于springboot 支付宝app端支付,可用于uni-app使用
  15. 【无人机航测实习简明教程】1 无人机航测常见名词术语解释
  16. 企业微信批量操作工具1.0
  17. Jetson Nano入门教程:硬件篇+视频学习教程
  18. 运维服务流程设计文档
  19. SQL Server错误代码大全及解释(留着备用)
  20. 文本议题分类及态度赋值分类

热门文章

  1. 自回归滑动平均模型ARMA
  2. odoo集成Echart报表和升级到最新nvd3报表
  3. NC200211 装备合成
  4. 绝对定位和相对定位的一些特性
  5. oracle dataguard延迟,dataguard延迟日志应用的问题
  6. Jetpack Compose——Image使用Coli加载网络图片(包含GIF、SVG)
  7. Android Glide加载图片时转换为圆形、圆角、毛玻璃等图片效果
  8. html点击按钮清空元素,jQuery怎么删除元素节点
  9. 华院计算 | 葛利普和他的燕园归宿
  10. Unity2020打包安卓时配置环境踩过的坑(JDKSDKNDKGradle详解)