本文主要讲述了实现安卓button点击变色与利用ViewPager实现图片自动轮播效果

我伞可以看到在很多应用中,安卓按钮按下时与正常时状态是不同的,这种效果也很容易达到。

第一步:创建XML文件定义不同事件的不同效果

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"android:drawable="@drawable/function_greenbutton_pressed" /> <!-- pressed --><item android:state_focused="true"android:drawable="@drawable/function_greenbutton_pressed" /> <!-- focused --><item android:drawable="@drawable/function_greenbutton_normal" /> <!-- default -->
</selector>

在上面就定义了在pressed与normal情况下,安卓的图片会自动替换的效果。

第二步:在布局文件中加入定义好的按钮就可以了

  <Button  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="按下文字会变效果"  android:textColor="@drawable/btn_color"  android:background="@drawable/btn_bg"  />  

利用ViewPager实现自动轮播图片

<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="200dp" /><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignBottom="@id/viewpager"android:background="#33000000"android:orientation="vertical" ><TextView
            android:id="@+id/image_desc"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="@string/app_name"android:textColor="@android:color/white"android:textSize="18sp" /><LinearLayout
            android:id="@+id/point_group"android:layout_width="wrap_content"android:layout_gravity="center_horizontal"android:layout_height="wrap_content" ></LinearLayout></LinearLayout></RelativeLayout>

注意viewPager引入时要用全类名,上面还定义了图片介绍与图片切换时小圆点也会切换

viewPager的主要方法

//设置适配器adapterviewPager.setAdapter(new MyPagerAdapter());
//设置当前的位置,轮播到哪一个图片了
viewPager.setCurrentItem(Integer.MAX_VALUE/2 - (Integer.MAX_VALUE/2%imageList.size())) ;
//设置viewPager的监听事件
viewPager.setOnPageChangeListener(new OnPageChangeListener() 

实现

适配器

private class MyPagerAdapter extends PagerAdapter {@Override/*** 获得页面的总数*/public int getCount() {return Integer.MAX_VALUE;}@Override/*** 获得相应位置上的view* container  view的容器,其实就是viewpager自身* position     相应的位置*/public Object instantiateItem(ViewGroup container, int position) {System.out.println("instantiateItem  ::"+position);// 给 container 添加一个viewcontainer.addView(imageList.get(position%imageList.size()));//返回一个和该view相对的objectreturn imageList.get(position%imageList.size());}@Override/*** 判断 view和object的对应关系 */public boolean isViewFromObject(View view, Object object) {if(view == object){return true;}else{return false;}}@Override/*** 销毁对应位置上的object*/public void destroyItem(ViewGroup container, int position, Object object) {System.out.println("destroyItem  ::"+position);container.removeView((View) object);object = null;}}

将当前页面总数设大一点,就可以实现无限循环了,viewpager总是只保持三个窗口,循环利用,并不会造成内存浪费,将当前项设置在中间,就可以左右自动循环了

事件监听实现

viewPager.setOnPageChangeListener(new OnPageChangeListener() {@Override/*** 页面切换后调用 * position  新的页面位置*/public void onPageSelected(int position) {position = position%imageList.size();//设置文字描述内容iamgeDesc.setText(imageDescriptions[position]);//改变指示点的状态//把当前点enbale 为true pointGroup.getChildAt(position).setEnabled(true);//把上一个点设为falsepointGroup.getChildAt(lastPosition).setEnabled(false);lastPosition = position;}@Override/*** 页面正在滑动的时候,回调*/public void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {}@Override/*** 当页面状态发生变化的时候,回调*/public void onPageScrollStateChanged(int state) {}});

实现自动播放

实现循环有以下几种方法
自动循环:
1、定时器:Timer
2、开子线程 while true 循环
3、ColckManager
4、 用handler 发送延时信息,实现循环

这里采用第四种

在onCreate方法中

         isRunning = true;handler.sendEmptyMessageDelayed(0, 2000);

定义handler

/*** 判断是否自动滚动*/private boolean isRunning = false;private Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {//让viewPager 滑动到下一页viewPager.setCurrentItem(viewPager.getCurrentItem()+1);if(isRunning){handler.sendEmptyMessageDelayed(0, 2000);}};};protected void onDestroy() {isRunning = false;};

另外,关于layoutParams 的一些小知识

//添加指示点
ImageView point =new ImageView(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.rightMargin = 20;
point.setLayoutParams(params);
point.setBackgroundResource(R.drawable.point_bg);

当元素是在LinearLayout中时,就要用LinearLayout.LayoutParams,在relativeLayout中时,就要用relativeLayout.LayoutParams

实现效果

Android之自定义控件入门相关推荐

  1. Android自定义控件入门到精通--Region区域

    <Android自定义控件入门到精通>文章索引 ☞ https://blog.csdn.net/Jhone_csdn/article/details/118146683 <Andro ...

  2. Android自定义控件入门到精通--View树的布局

    <Android自定义控件入门到精通>文章索引 ☞ https://blog.csdn.net/Jhone_csdn/article/details/118146683 <Andro ...

  3. 我的新书《Android自定义控件入门与实战》出版啦

    前言:当你回首往事时,不以虚度年华而悔恨,不以碌碌无为而羞耻,那你就可以骄傲的跟自己讲,你不负此生 [Android自定义控件入门与实战]勘误:https://blog.csdn.net/harvic ...

  4. Android自定义控件入门到精通--View树的测量流程

    <Android自定义控件入门到精通>文章索引 ☞ https://blog.csdn.net/Jhone_csdn/article/details/118146683 <Andro ...

  5. android 开发从入门到精通

    Android-Tips This is an awesome list of tips for android. If you are a beginner, this list will be t ...

  6. 5G 时代的 Android App 开发入门与项目实战

    随着移动互联网的持续发展,Android系统从智能手机逐步拓展到平板电脑.智能电视.车载大屏.智能家居.智能手表等诸多设备,Android开发依然是前景可期的IT岗位. 当然,整个社会正在迈向5G时代 ...

  7. 《Android应用开发入门经典(第3版)》——第6.1节创建演示应用

    本节书摘来自异步社区<Android应用开发入门经典(第3版)>一书中的第6章,第6.1节创建演示应用,作者 [美]Carmen Delessio , Lauren Darcey , Sh ...

  8. 《Android应用开发入门经典(第3版)》——导读

    本节书摘来自异步社区<Android应用开发入门经典(第3版)>一书中的目录,作者 [美]Carmen Delessio , Lauren Darcey , Shane Conder,更多 ...

  9. Android渗透测试Android渗透测试入门教程大学霸

    Android渗透测试Android渗透测试入门教程大学霸 第1章  Android渗透测试 Android是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机.平板等.目前 ...

最新文章

  1. FACEBOOK’S CALIBRA
  2. 活动 | Daung~!他们用产品思维改变医疗挂号问题
  3. 用JAVA语言创建链表的方法
  4. android studio for循环快捷键,Android Studio 快捷键 for Mac OS X
  5. 重庆三峡学院计算机英语期末考试,英语语言学试题B卷及答案(重庆三峡学院)
  6. Croc Champ 2013 - Round 1 E. Copying Data(线段树)
  7. 关于嵌入式系统的启动
  8. 终极讲师介绍:集齐 27 位大神召唤亚洲首届 Rust 开发者大会!
  9. Canvas之绘制折线图
  10. webpack与ts版本不兼容
  11. 【风宇冲】动画系统Mecanim
  12. OpenStack历史知识
  13. hermit插值 matlab,埃尔米特(Hermite)插值及其MATLAB程序
  14. 关于asc、txt格式到pcd、ply格式数据转换
  15. 总结编译Liblas库时的问题(会及时更新解决博友遇到的问题)
  16. Ubuntu之Sailfish OS开发环境搭建
  17. Java 抽象类与接口 编程练习
  18. html5css背景色代码,background css背景
  19. android基础篇之Intent用法
  20. 迅捷文本转换器范本演示

热门文章

  1. 不要再纠结卷积的公式啦!0公式深度解析全连接前馈网络与卷积神经网络
  2. 论文浅尝 | 基于知识库的自然语言理解 04#
  3. Pycharm使用远程服务器运行代码
  4. Postman使用小教程--基础入门篇
  5. 配置opencv cmake
  6. Windows下MYSQL的安装与配置
  7. 安装redis和phpredis模块
  8. POJ 2255/递归:前序中序求后序
  9. 定制自己的Windows CE 5.0 ARM中文模拟器(转)
  10. Run-time system与虚拟机