经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
【Android初级】如何实现一个有动画效果的自定义下拉菜单
来源:cnblogs  作者:snowyeti  时间:2021/2/22 8:39:07  对本文有异议

我们在购物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、效果图如下:

原文链接:http://www.cnblogs.com/snowyeti/p/14423857.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号