我们在购物APP里面设置收货地址时,都会有让我们选择省份及城市的下拉菜单项。今天我将使用Android原生的 Spinner 控件来实现一个自定义的下拉菜单功能,并配上一个透明渐变动画效果。

要实现的功能及思路如下:

  1. 下拉菜单样式是自定义的、非原生效果:需要使用 setDropDownViewResource 方法来设置下拉视图的布局样式。该方法需要传入布局资源,该布局需要定义每个 Item 的属性,比如宽高和文字颜色等(为了使效果明显,我将每个 Item 的高度设置为 50 dp,文字设置为蓝色)
  2. 点击这个 Spinner 控件时,让其运行一段“从左到右、逐渐显示”的渐变动画:我通过 xml 的方式来定义这个动画,需要包含 translate(位移) 和 alpha(透明度) 两个TAG,并设置相应的属性值
  3. 下拉菜单的内容列表要展示在 Spinner 里面,需要通过适配器 Adapter 跟 Spinner 进行绑定:可以直接使用Android原生的 ArrayAdapter
  4. 选择任意一个 Item 后,将其内容展示在界面上,告知用户选择的内容:需要实现 Spinner 的 onItemSelected 监听回调

源码如下:

1、主Activity(注意代码中的注释,不然你会遇到一些坑!)

  1. public class SpinnerDemo extends Activity {
  2. private static final String[] countries = {"北京", "上海", "广州", "深圳", "成都", "杭州"};
  3. private TextView mTextView;
  4. private Spinner mSpinner;
  5. private ArrayAdapter<String> mAdapter;
  6. private Animation mAnimation;
  7. @Override
  8. protected void onCreate(Bundle onSavedInstance) {
  9. super.onCreate(onSavedInstance);
  10. setContentView(R.layout.spinner_demo);
  11. mTextView = findViewById(R.id.textView9);
  12. mSpinner = findViewById(R.id.spinner);
  13. mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, countries);
  14. // 自定义的下拉视图布局样式
  15. mAdapter.setDropDownViewResource(R.layout.spinner_drop_down);
  16. // 设置数据的适配器
  17. mSpinner.setAdapter(mAdapter);
  18. mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  19. @Override
  20. public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
  21. mTextView.setText("你选择的是:" + countries[position]);
  22. // 一定要设置父视图可见,否则 在选择后,Spinner会消失
  23. parent.setVisibility(View.VISIBLE);
  24. }
  25. @Override
  26. public void onNothingSelected(AdapterView<?> parent) {
  27. }
  28. });
  29. // 通过 xml 的形式来定义动画
  30. mAnimation = AnimationUtils.loadAnimation(this, R.anim.my_anim);
  31. mSpinner.setOnTouchListener(new Spinner.OnTouchListener() {
  32. @Override
  33. public boolean onTouch(View v, MotionEvent event) {
  34. // 点击 Spinner 后,运行动画
  35. v.startAnimation(mAnimation);
  36. return false;
  37. }
  38. });
  39. }
  40. }

2、布局文件 spinner_demo.xml 如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <TextView android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:layout_gravity="center"
  9. android:id="@+id/textView9"/>
  10. <Spinner android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:id="@+id/spinner"
  13. android:layout_gravity="center"
  14. android:layout_marginTop="15dp"/>
  15. </LinearLayout>

3、自定义的下拉视图样式布局文件 spinner_drop_down.xml 如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TextView xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="wrap_content"
  4. android:layout_height="50dp"
  5. android:textColor="@color/colorBlue"
  6. android:singleLine="true"
  7. style="?android:attr/spinnerDropDownItemStyle">
  8. </TextView>

4、自定义动画 xml 文件如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromXDelta="0"
  5. android:toXDelta="50%p"
  6. android:duration="2000"/>
  7. <alpha
  8. android:fromAlpha="0.0"
  9. android:toAlpha="1.0"
  10. android:duration="2000"/>
  11. </set>

5、效果图如下:

【Android初级】如何实现一个有动画效果的自定义下拉菜单的更多相关文章

  1. 使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态。点击列表的项,切换二级列表的显示或隐藏状态

    查看本章节 查看作业目录 需求说明: 使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态.点击列表的项,切 ...

  2. android 自定义下拉菜单

    本实例的自定义下拉菜单主要是继承PopupWindow类来实现的弹出窗体,各种布局效果可以根据自己定义设计.弹出的动画效果主要用到了translate.alpha.scale,具体实现步骤如下: 先上 ...

  3. 封装dropdown模块(使用到之前写好的动画组件,封装下拉菜单)

    用 showhide 改写dropdown 模块: 1.首先在 css中新增动画相关样式 /*showhide组件的样式*/ .fadeOut{ opacity:; visibility: hidde ...

  4. 一个用纯CSS实现的下拉菜单

    用CSS做下拉列表的特效,代码如下: <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> & ...

  5. 一个css和js结合的下拉菜单,支持主流浏览器

    首先声明: 本人尽管在web前端岗位干了好多年,但无奈岗位对技术要求不高.html,css用的比較多,JavaScript自己原创的非常少,基本都是copy改动,所以自己真正动手写时,发现基础非常不坚 ...

  6. 一个用css写出来的下拉菜单

    1 <style> 2 /* css*/ 3 #body{ 4 float: left; 5 } 6 #xialakuang{ 7 background-color:#f9f9f9; 8 ...

  7. 如何在webapp中做出原生的ios下拉菜单效果

    github:https://github.com/zhoushengmufc/iosselect webapp模仿ios下拉菜单 html下拉菜单select在安卓和IOS下表现不一样,iossel ...

  8. 原生js实现一个自定义下拉单选选择框

    浏览器自带的原生下拉框不太美观,而且各个浏览器表现也不一致,UI一般给的下拉框也是和原生的下拉框差别比较大的,这就需要自己写一个基本功能的下拉菜单/下拉选择框了.最近,把项目中用到的下拉框组件重新封装 ...

  9. Android动画效果之自定义ViewGroup添加布局动画

    前言: 前面几篇文章介绍了补间动画.逐帧动画.属性动画,大部分都是针对View来实现的动画,那么该如何为了一个ViewGroup添加动画呢?今天结合自定义ViewGroup来学习一下布局动画.本文将通 ...

随机推荐

  1. Java——集合框架之Set&HashSet,HashMap,泛型,compareTo

    Set Set接口--数据存放无序,非常简单,主要呈现信息列表 Set接口存储一组唯一.无序的对象 HashSet是Set接口常用的实现类 Set接口不存在get方法 Iterator接口:表示对集合 ...

  2. hibernate学习笔记(1)结构与基本数据类型

    一,概览 Hibernate负责从Java类到数据库表的映射,以及从Java数据类型到SQL数据类型的映射.另外还提​​供数据查询和检索功能.它可以显着减少在SQL和JDBC中手动处理数据的开发时间. ...

  3. centos安装、升级新火狐最新版 31

    1.登录火狐主页 下载最新版本firefox-31.0.tar.bz2 解压: tar -jxvf firefox-31.0.tar.bz2 2.然后把旧版本的firefox卸掉 # yum eras ...

  4. three.js cannon.js物理引擎制作一个保龄球游戏

    关于cannon.js我们已经学习了一些知识,今天郭先生就使用已学的cannon.js物理引擎的知识配合three基础知识来做一个保龄球小游戏,效果如下图,在线案例请点击博客原文. 我们需要掌握的技能 ...

  5. 【BFS】hdu 1973 Prime Path

    题目描述: http://poj.org/problem?id=3414 中文大意: 使用两个锅,盛取定量水. 两个锅的容量和目标水量由用户输入. 允许的操作有:灌满锅.倒光锅内的水.一个锅中的水倒入 ...

  6. STL_优先队列

    一.简介 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队. 元素 ...

  7. Codeforces Round #628 (Div. 2) A. EhAb AnD gCd(LCM & GCD)

    题意: GCD(a,b) + LCM(a,b) = n,已知 n ,求 a,b. 思路: 设 gcd(a, b) = k, a = xk, b = yk , k + ab / k = n xy = n ...

  8. HDU - 1059 背包dp

    题目: 有两个小朋友想要平分一大堆糖果,但他们不知道如何平分需要你的帮助,由于没有spj我们只需回答能否平分即可. 糖果大小有6种分别是1.2.3.4.5.6,每种若干颗,现在需要知道能不能将这些糖果 ...

  9. 使用docker时报错“net/http: TLS handshake timeout”

    问题原因 :该命令默认从docker远端镜像仓库中拉取镜像,但由于远端仓库的服务器是在国外,我们国内有的用户很可能都访问不到 解决:使用国内镜像仓库 docker pull registry.dock ...

  10. Java15 运行Hello,world竟然不用javac?

    喜欢尝鲜的我,装好了Java15,如下编写了一个输出语句:hello,world. 当我打开cmd准备运行的时候,惊呆了! 以前java8的时候不都是这样操作的吗?最初以为环境配置问题,可以即便在系统 ...