对于做Android开发的工程师对于这个效果的实现一定不陌生,本篇我将带领大家先简单实现这个效果,再为大家介绍一下其中的原理,方便新手学习,老手复习,内容简单易懂,没有基础一样学习,不扯没用的了,下面开始我们本篇内容的干货。

  对于这个效果的实现,第一次接触时倍感困难,在之前的博客中为大家介绍了如何实现引导页效果,虽然带领大家实现了上述功能,但是对于具体的实现,其实内心有疑惑的,当初不是什么的清楚其中的原理,经过这些天的不懈努力,终于被我攻破了,开始介绍一下实现的原理:1、既然是广告效果,一定需要图片切换;2、图片切换要有标识,方便用户查看;3、图片切换要实现自动内容切换。这三点中最难的当属后两个了,在之前的文章中我已经带领大家实现过第一个效果了,有兴趣的小童鞋可以自行学习。

  我们开始今天的工作,首先我们需要准备6张图片(两张圆点图片+四张任意图片),用于我们实现的需要。对于圆点图片大家有时间不容易找,我为大家提供两种参考:

  白色:

  蓝色:

  仅供参考,大家如果有更好的,请绕道。

  准备好素材后,下面我们开始设计我们的代码:
  一、在res下新建一个drawable文件夹,在其中新建一个round.xml,用于我们上面两张图片切换显示控制,具体代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/blank"/>
<item android:state_selected="false" android:drawable="@drawable/white"/>
</selector>

  二、下面我们开始我们的布局文件书写:

<RelativeLayout 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"
tools:context=".MainActivity" > <android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<LinearLayout
android:id="@+id/ll"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="20dp"
android:layout_centerHorizontal="true"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/round"
android:layout_marginRight="5dp"
android:visibility="gone"
android:clickable="true"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/round"
android:layout_marginRight="5dp"
android:visibility="gone"
android:clickable="true"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/round"
android:layout_marginRight="5dp"
android:visibility="gone"
android:clickable="true"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/round"
android:layout_marginRight="5dp"
android:visibility="gone"
android:clickable="true"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/round"
android:layout_marginRight="5dp"
android:visibility="gone"
android:clickable="true"
/>
</LinearLayout> </RelativeLayout>

  注释:蓝色标注处表示LinearLayout至于界面底部;红色标注处表示应用我们配置好的图片信息,现在我们的界面效果是看不出来的,因为ImagerView我设置了销毁属性(android:visibility="gone"),这个不影响,在下面的代码中我们来控制显示。

  三、我们实现图片切换时,用到了PagerAdapter,这里为了方便我们设计代码,我设计了一个自定义的PagerAdapter对象:MyselfPagerAdapter.java:

public class MyselfPagerAdapter extends PagerAdapter {

    private List<View> view;

    public MyselfPagerAdapter(List<View> view){
this.view = view;
} @Override
public int getCount() {
if(view!=null){
return view.size();
}
return 0;
} @Override
//销毁position位置的界面
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView(view.get(position));
} @Override
//初始化position位置的界面
public Object instantiateItem(View container, int position) {
((ViewPager) container).addView(view.get(position));
return view.get(position);
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
} }

  下面就是我们今天的重头戏了:MainActivity.java,先看代码,下面做解释。

public class MainActivity extends Activity implements OnPageChangeListener, OnClickListener{

    private ViewPager vp;
private MyselfPagerAdapter myselfPagerAdapter;
private List<View> listView;
private ImageView[] round; private static final int [] imagerResource = {R.drawable.imager1, R.drawable.imager2, R.drawable.imager3, R.drawable.imager4}; public int currentIndex = 0;
private Handler handler = new Handler();
public MyRunnable myRunnable = new MyRunnable(); public boolean flag = false; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main); init(); vp = (ViewPager) findViewById(R.id.viewPager);
myselfPagerAdapter = new MyselfPagerAdapter(listView);
vp.setAdapter(myselfPagerAdapter);
vp.setOnPageChangeListener(this); //初始化底部小点
initRound(); handler.postDelayed(myRunnable, 3000); } private void init() {
listView = new ArrayList<View>();
for(int i = 0; i<imagerResource.length; i++){
ImageView imageView = new ImageView(this);
imageView.setImageResource(imagerResource[i]);
listView.add(imageView);
}
} private void initRound() {
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
round = new ImageView[imagerResource.length];
for(int i=0; i<imagerResource.length; i++){
round[i] = (ImageView) ll.getChildAt(i);
round[i].setVisibility(View.VISIBLE);
round[i].setOnClickListener(this);
round[i].setSelected(false);
round[i].setTag(i);
}
round[currentIndex].setSelected(true);
} private void setCurView(int position){
if(position<0||position>=imagerResource.length){
return;
}
vp.setCurrentItem(position);
} private void setRoundView(int position){
if(position<0||position>=imagerResource.length||currentIndex==position){
return;
}
round[position].setSelected(true);
round[currentIndex].setSelected(false);
currentIndex = position;
} @Override
//当滑动状态改变时调用
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub } @Override
//当前页面被滑动时调用
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub } @Override
//当新的页面被选中时调用
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
setRoundView(arg0);
} @Override
public void onClick(View v) {
int position = (Integer)v.getTag();
setCurView(position);
setRoundView(position);
} class MyRunnable implements Runnable{ @Override
public void run() {
int n = currentIndex; if(n == imagerResource.length-1){
flag = false;
}else{
if(n == 0){
flag = true;
}
}
if(flag){
n = (n + 1)%listView.size();
}else{
n = (n - 1)%listView.size();
} setCurView(n);
setRoundView(n);
handler.postDelayed(myRunnable, 3000);
} } }

  这两段代码的作用:为我们添加ImagerView的点击事件做铺垫

private void setCurView(int position){
if(position<0||position>=imagerResource.length){
return;
}
vp.setCurrentItem(position);
} private void setRoundView(int position){
if(position<0||position>=imagerResource.length||currentIndex==position){
return;
}
round[position].setSelected(true);
round[currentIndex].setSelected(false);
currentIndex = position;
}

  这段代码的作用:实现图片的自动切换,有别于平常的切换,大家运行自行查看:

class MyRunnable implements Runnable{

        @Override
public void run() {
int n = currentIndex; if(n == imagerResource.length-1){
flag = false;
}else{
if(n == 0){
flag = true;
}
}
if(flag){
n = (n + 1)%listView.size();
}else{
n = (n - 1)%listView.size();
} setCurView(n);
setRoundView(n);
handler.postDelayed(myRunnable, 3000);
} }

  最后附一张效果图,供大家参考:

  

  今天的介绍就到这里,大家有什么疑问,请留言。

  

  

Androd开发之广告栏设计的更多相关文章

  1. Windows10 UWP开发 - 响应式设计

      Windows10 UWP开发 - 响应式设计 本篇随笔与大家简单讨论一下在开发适配不同分辨率.宽高比的Windows10 Universal App布局时的可行方式与小技巧.经验均从实践中总结, ...

  2. 以DDD为开发模式的设计开发步骤可以是

    以DDD为开发模式的设计开发步骤可以是:1)分析需求:2)画出用例图,系统中各个角色如何使用系统,也包括外部系统如何使用系统,也包括系统中到某个时间点自动启动的某些功能(此时角色就是时间):3)针对各 ...

  3. 用thinkphp进行微信开发的整体设计思考

    用thinkphp进行微信开发的整体设计思考 http://www.2cto.com/weixin/201504/388423.html 2015-04-09      0个评论       作者:明 ...

  4. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  5. 前端开发组件化设计vue,react,angular原则漫谈

    前端开发组件化设计vue,react,angular原则漫谈 https://www.toutiao.com/a6346443500179505410/?tt_from=weixin&utm_ ...

  6. Java-异常机制详解以及开发时异常设计的原则要求

    Java-异常机制详解以及开发时异常设计的原则要求 http://blog.csdn.net/Jack__Frost/article/details/52760930?locationNum=6

  7. 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)

    前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...

  8. 常用网站--前端开发类+网页设计类+平面素材类+flash类

    前端开发类 animate CSS 前端开发网 我爱CSS 大家网 W3School jQuery开发技术详解教程视频 jQuery中文社区 jQueryChina 网页设计类 禅意花园 CSS Do ...

  9. DailyTick 开发实录 —— UI 设计

    上次的文章中描述了 DailyTick 的设计理念.经过两周左右的设计和开发,现在 DailyTick 的主要 UI 已经完成了原型的设计和初步的实现.既然是原型,当然看起来就有点粗糙. 主 UI 主 ...

随机推荐

  1. 关于java8 interface的default方法

    转自鸟窝 博主写的挺详细,不了解的看一看啊 以前经常谈论的Java对比c++的一个优势是Java中没有多继承的问题. 因为Java中子类只能继承(extends)单个父类, 尽管可以实现(implem ...

  2. 基于OpenCv的人脸检测、识别系统学习制作笔记之三

    1.在windows下编写人脸检测.识别系统.目前已完成:可利用摄像头提取图像,并将人脸检测出来,未进行识别. 2.在linux下进行编译在windows环境下已经能运行的代码. 为此进行了linux ...

  3. 【转】IE劫持原理 BHO

    为什么"浏览器劫持"能够如此猖狂呢?放眼众多论坛的求助贴,我们不时可以看到诸如"我的IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回自己的地址,可是一重启 ...

  4. video标签的属性和方法总结

    最近想做一个弹幕插件,查了很多video标签的属性和方法 error属性 在正常读取时候,使用媒体数据的过程中,video元素或audio元素的error属性为null,但是任何时候只要出现错误,er ...

  5. 升级到win8.1右键响应慢

    网上很多资料都是在显卡上做文章,试了N次确定不是这个问题. 后来查到这个好用了.以管理员身份运行 下面代码保存bat即可 regsvr32 /u /s igfxpph.dll reg delete H ...

  6. Alamofire源码学习

    Core文件夹:          Alamofire.swift - - - 该文件中主要是给用户提供一些便利的调用方法,用户可以直接调用该文件中的便利方法来使用Alamofire相关功能.     ...

  7. 00.PHP学习建议

    各位师弟师妹,大家好~PHP不是我们专业的本该有的方向.我不知道大家为什么来学习这门语言,也许是自己了解之后喜欢这门语言(我想这种可能在我们专业是挺少的),也许是听守中哥说这门语言简单好学,为了躲避学 ...

  8. 千呼万唤始出来!—— GG(高仿QQ)终于有移动端了!(技术原理、实现、源码)

    首先要感谢大家一直以来对于GG的关注和支持!GG的不断完善与大家的支持分不开! 从2013年最初的GG1.0,到后来陆续增加了网盘功能.远程协助功能.离线文件功能.群聊功能.语音聊天功能.视频聊天功能 ...

  9. Android(蓝牙)

    因近期项目需求调试了Android蓝牙通讯接口,主要是两个终端作为服务端和客户端的通信,本文将部分重要知识点记录如下. 蓝牙是短距离无线通信,通常分经典蓝牙和低功耗蓝牙(即蓝牙4.0),两类蓝牙协议各 ...

  10. 【Java】ThreadLocal细节分析

    ThreadLocal通过中文解释就是线程本地变量,是线程的一个局部变量.根据哲学家黑格尔“的存在即合理”的说法,ThreadLocal的出现肯定是有它的意义,它的出现也是因为多线程的一个产物.Thr ...