Androd开发之广告栏设计

  对于做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.ViewPagerandroid: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;}@Overridepublic 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);}@Overridepublic 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;@Overrideprotected 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);}@Overridepublic void onClick(View v) {int position = (Integer)v.getTag();setCurView(position);setRoundView(position);}class MyRunnable implements Runnable{@Overridepublic 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{@Overridepublic 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);}}

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

  

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

  

  

转载于:https://www.cnblogs.com/AndroidJotting/p/4540637.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle数据库归档闪回,[Oracle]Oracle的闪回归档

Oracle的闪回归档场景需求&#xff0c;由于管理数据库的一些核心表&#xff0c;在实施初期会有人为误删除的问题。Oracle 11gR2提供了闪回归档的特性&#xff0c;可以保证不用RMAN来恢复误删除的数据。实践如下:1.创建一个公共的闪回表空间。用于各个业务模块都可以使用的闪回区…

在exe执行机上安装MCR环境(matlab运行环境)

未安装matlab的执行机上运行matlab生成的exe&#xff0c;需要提前安装好MCR。此文介绍安装方法。 1、 D:\MATLAB\R2016a\toolbox\compiler\deploy\win64 中MCRinstaller.exe 安装到该计算机上 2、 Mbuild –setup 安装合适的编译器 3、 将M 文件编译为可执行文件的语法是 mc…

终端乱码的终极解决方案

From:http://handao.blog.techweb.com.cn/archives/193.html 初入linux的程序员们&#xff0c;经常会受到乱码的问候。可谓“始乱终弃”。因为乱码&#xff0c;并且最终放弃了linux的不在少数。好吧&#xff0c;言归正传&#xff0c;先看看各类乱码是怎么形成的。 中文字符乱码…

锐捷官方提供122套实验题.

锐捷官方提供122套实验题.http://u.115.com/file/f058c9459e转载于:https://blog.51cto.com/lidai/430896

db2存储结构换Oracle,DB2中实现Oracle的功能

1.如何实现分页显示的Oracle和DB2的写法Oracle 可以这样实现﹕SQL>select rownum,* from BSEMPMS where rownum >5 and rownum <100;DB2 可以这样实现﹕select * from (select ROW_NUMBER() over() as a, db2admin.bsempms.* fromdb2admin.bsempms) as temp where a&g…

iOS中assign、copy 、retain等关键字的含义

assign&#xff1a; 简单赋值&#xff0c;不更改索引计数copy&#xff1a; 建立一个索引计数为1的对象&#xff0c;然后释放旧对象retain&#xff1a;释放旧的对象&#xff0c;将旧对象的值赋予输入对象&#xff0c;再提高输入对象的索引计数为1 Copy其实是建立了一个相同的对象…

公布生成cscope.out, cscope.files, tags的脚本文件

通过VIM搭建一个IDE&#xff0c;网上的文章有很多&#xff0c;这里就不献丑了。 下面记录下生成tags&#xff0c;cscope.out&#xff0c; cscope.files的脚本文件 一、windows版本(.bat) del cscope.out cscope.files tags echo del "cscope.out cscope.files tags&qu…

Qt Label自适应显示Logo图片

一、要求 Qt Creator Ui中的Label标签控件显示一张Logo图片&#xff0c;要求图片自适应控件的大小。 二、实现&#xff08;代码&#xff09; QImage Image;//声明QImage 对象 Image.load(":/image/image/logo.jpg");//加载图片&#xff0c;前提是该图片存在项目的…

外刊评终极平板电脑十大功能:防眩目屏幕在列

在目前的平板电脑市场&#xff0c;还没有哪一款产品能够满足消费者的所有需求。因此美国著名IT杂志《PCWorld》网站专栏作家评出终极平板电脑的十大功能特点。1. 重量和外形尺寸 目前市场的多数平板电脑的厚度都至少有0.5英寸&#xff08;约合1.27厘米&#xff09;&#xff0c;…

oracle数据倾斜优化,Hive数据倾斜优化 - ericquan8的个人页面 - OSCHINA - 中文开源技术交流社区...

数据倾斜成因&#xff1a;由于数据分布不均匀&#xff0c;造成数据大量的集中到一点&#xff0c;造成数据热点。具体为某一个reduce接收到的数据是其他reduce的n倍&#xff0c;导致明显的木桶效应。症状&#xff1a;1&#xff0c;对表做select count(1) from tb group by key&a…

Ubuntu 10.10升级显卡驱动后开机动画低分辨率问题

From: http://hi.baidu.com/feisit/blog/item/9e909dcef06b120c93457e76.html 为了使用compiz桌面特效&#xff0c;安装了Nvidia的限制驱动&#xff0c;启动画面splash的分辨率由1680x1050降低成640x480&#xff0c;甚至没有开机画面&#xff0c;只显示一些字母和数字&#xff…

在AIX上编译Samba

我在AIX上编译Samba的实况贴&#xff0c;贴上来备忘。 废话不说&#xff0c;进入正题。 我用的gcc版本&#xff1a; bash-3.00# gcc -v Using built-in specs. Target: powerpc-ibm-aix6.1.0.0 Configured with: ../gcc-4.2.4/configure --with-as/usr/bin/as --with-ld/usr/bi…

STM32单片机低功耗配置

一、低功耗模式 当CPU不需继续运行时&#xff0c;可以利用多种低功耗模式来节省功耗&#xff0c;STM32支持三种低功耗模式&#xff0c;可以在要求低功耗、短启动时间和多种唤醒事件之间达到最佳的平衡。 睡眠模式SleepMode。在睡眠模式&#xff0c;只有CPU停止&#xff0c;所…

plsql连接oracle11g怎么配置,怎么使用plsql怎么连接64位Oracle11g数据库?

win764位Oracle11g64位下使用PLSQLDeveloper的解决办法1)安装Oracle 11g 64位 (这部分就不说了吧)2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0)下载instantclient-basic-win32-11.2.0.1.0.zip (一定得是32位的&#xff0c;不要下错了版本&#xff0c;Orac…

在Ubuntu下设置笔记本外接显示器(双显示器)

From: http://www.xyfish.com/thread-216-1-1.html Ubuntu 8.04 设置笔记本电脑双显示器 目录&#xff1a; 1、设置显示分辨率及 xrandr 介绍 2、GNOME下切换双屏的方法 3、关于双屏下 GNOME面板/ wine / 阿里旺旺的一些问题及解决 正文&#xff1a; 1、设置显示分辨率及 xr…

我的第一个REST客户端程序!

Delphi&#xff1a;XE8 看了好几天的资料了&#xff0c;也没有弄出来一个REST程序&#xff0c;尝试了XE8中带的例子&#xff0c;也都没有搞懂。我在网上不断搜索&#xff0c;看是否能够找到适合自己的文章&#xff0c;希望能够做出来一个REST的小例子&#xff0c;万幸&#xff…

STM32 CubeMX 利用设置串口UART采用DMA接收

一、踩过的坑 1、CubeMX 生成工程的时候询问是否升级固件F103的1.61版本库&#xff0c;可以直接忽略&#xff0c;选择本地已经安装的1.60。否则不会导入HAL库到工程中。 2、产生代码的最后一步&#xff0c;选择对每个外设分别生成.c/.h文件&#xff0c;项目结构更清晰。 3、…