本组件主要用到了一个开源项目 Android Wheel Control 和 android的popWindow弹窗技术;
实现效果如下图:
不说废话,直接上代码
核心处理代码:
package com.example.poptest; import kankan.wheel.widget.OnWheelChangedListener; import kankan.wheel.widget.OnWheelScrollListener; import kankan.wheel.widget.WheelView; import kankan.wheel.widget.adapters.AbstractWheelTextAdapter; import kankan.wheel.widget.adapters.ArrayWheelAdapter; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.Display; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.TextView; /**** * @production packview风格的三级城市底部弹出菜单组件 * @company android技术帮--【技术成就梦想】 * @department 群号:85506951 * @author 大灰狼叔叔(qq:953486326) * {@docRoot 利用Android Wheel Control 实现的packview风格的三级城市底部弹出菜单 } * @version 1.0 * @since 2013\4\15 * @see 欢迎对android感兴趣的童鞋加入android技术帮,共同学习,共同进步! * ****/ public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private Button button,button_ok; RelativeLayout test_pop_layout; int width,height; private TextView tt ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取屏幕的高度和宽度 Display display = this.getWindowManager().getDefaultDisplay(); width = display.getWidth(); height = display.getHeight(); // 获取弹出的layout test_pop_layout = (RelativeLayout)findViewById(R.id.test_pop_layout); tt = (TextView)findViewById(R.id.tpop2_tv); button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 显示 popupWindow PopupWindow popupWindow = makePopupWindow(MainActivity.this); int[] xy = new int[2]; test_pop_layout.getLocationOnScreen(xy); popupWindow.showAtLocation(test_pop_layout,Gravity.CENTER|Gravity.BOTTOM, 0, -height); } }); } // Scrolling flag private boolean scrolling = false; private TextView tv; // 创建一个包含自定义view的PopupWindow private PopupWindow makePopupWindow(Context cx) { final PopupWindow window; window = new PopupWindow(cx); View contentView = LayoutInflater.from(this).inflate(R.layout.cities_layout, null); window.setContentView(contentView); tv = (TextView)contentView.findViewById(R.id.tv_cityName); final WheelView country = (WheelView) contentView.findViewById(R.id.country); country.setVisibleItems(3); country.setViewAdapter(new CountryAdapter(this)); final String cities[][] = AddressData.CITIES; final String ccities[][][] = AddressData.COUNTIES; final WheelView city = (WheelView) contentView.findViewById(R.id.city); city.setVisibleItems(0); country.addChangingListener(new OnWheelChangedListener() { public void onChanged(WheelView wheel, int oldValue, int newValue) { if (!scrolling) { updateCities(city, cities, newValue); } } }); country.addScrollingListener( new OnWheelScrollListener() { public void onScrollingStarted(WheelView wheel) { scrolling = true; } public void onScrollingFinished(WheelView wheel) { scrolling = false; updateCities(city, cities, country.getCurrentItem()); tv.setText( AddressData.PROVINCES[country.getCurrentItem()] ); } }); // 地区选择 final WheelView ccity = (WheelView) contentView.findViewById(R.id.ccity); ccity.setVisibleItems(0); city.addChangingListener(new OnWheelChangedListener() { public void onChanged(WheelView wheel, int oldValue, int newValue) { if (!scrolling) { updatecCities(ccity, ccities, country.getCurrentItem(),newValue); } } }); city.addScrollingListener( new OnWheelScrollListener() { public void onScrollingStarted(WheelView wheel) { scrolling = true; } public void onScrollingFinished(WheelView wheel) { scrolling = false; updatecCities(ccity, ccities, country.getCurrentItem(), city.getCurrentItem()); tv.setText( AddressData.PROVINCES[country.getCurrentItem()] + "-" + AddressData.CITIES[country.getCurrentItem()][city.getCurrentItem()]); } }); ccity.addScrollingListener( new OnWheelScrollListener() { public void onScrollingStarted(WheelView wheel) { scrolling = true; } public void onScrollingFinished(WheelView wheel) { scrolling = false; tv.setText( AddressData.PROVINCES[country.getCurrentItem()] + "-" + AddressData.CITIES[country.getCurrentItem()][city.getCurrentItem()] + "-" + AddressData.COUNTIES[country.getCurrentItem()][city.getCurrentItem()][ccity.getCurrentItem()]); } }); country.setCurrentItem(1); // 点击事件处理 button_ok = (Button)contentView.findViewById(R.id.button_ok); button_ok.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { tt.setText(AddressData.PROVINCES[country.getCurrentItem()] + "-" + AddressData.CITIES[country.getCurrentItem()][city.getCurrentItem()] + "-" + AddressData.COUNTIES[country.getCurrentItem()][city.getCurrentItem()][ccity.getCurrentItem()]); window.dismiss(); // 隐藏 } }); window.setWidth(width); window.setHeight(height/2); // 设置PopupWindow外部区域是否可触摸 window.setFocusable(true); //设置PopupWindow可获得焦点 window.setTouchable(true); //设置PopupWindow可触摸 window.setOutsideTouchable(true); //设置非PopupWindow区域可触摸 return window; } /** * Updates the city wheel */ private void updateCities(WheelView city, String cities[][], int index) { ArrayWheelAdapter<String> adapter = new ArrayWheelAdapter<String>(this, cities[index]); adapter.setTextSize(18); city.setViewAdapter(adapter); city.setCurrentItem(cities[index].length / 2); } /** * Updates the ccity wheel */ private void updatecCities(WheelView city, String ccities[][][], int index,int index2) { ArrayWheelAdapter<String> adapter = new ArrayWheelAdapter<String>(this, ccities[index][index2]); adapter.setTextSize(18); city.setViewAdapter(adapter); city.setCurrentItem(ccities[index][index2].length / 2); } /** * Adapter for countries */ private class CountryAdapter extends AbstractWheelTextAdapter { // Countries names private String countries[] = AddressData.PROVINCES; /** * Constructor */ protected CountryAdapter(Context context) { super(context, R.layout.country_layout, NO_RESOURCE); setItemTextResource(R.id.country_name); } @Override public View getItem(int index, View cachedView, ViewGroup parent) { View view = super.getItem(index, cachedView, parent); return view; } @Override public int getItemsCount() { return countries.length; } @Override protected CharSequence getItemText(int index) { return countries[index]; } } }
核心布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:orientation="vertical" android:background="@drawable/layout_bg" android:layout_width="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/tv_cityName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginLeft="5dp" android:text="请选择城市" android:layout_weight="2"/> <Button android:id="@+id/button_ok" android:layout_width="12dip" android:layout_height="wrap_content" android:layout_gravity="right" android:layout_marginTop="5dp" android:layout_marginRight="5dp" android:text="确定" android:layout_weight="1"/> </LinearLayout> <LinearLayout android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_width="fill_parent" android:paddingLeft="12dp" android:paddingRight="12dp" android:paddingTop="4dp" android:layout_marginTop="8dp" android:orientation="horizontal"> <kankan.wheel.widget.WheelView android:id="@+id/country" android:layout_height="110dp" android:layout_width="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1"/> <kankan.wheel.widget.WheelView android:id="@+id/city" android:layout_height="110dp" android:layout_width="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="5dp" android:layout_weight="1"/> <kankan.wheel.widget.WheelView android:id="@+id/ccity" android:layout_height="110dp" android:layout_width="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="5dp" android:layout_weight="1"/> </LinearLayout> <!-- Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="18dp" android:textSize="18sp" android:text=" Next > "/--> </LinearLayout>
也可以到csdn下载:
http://download.csdn.net/detail/helloworldjavaee/5260020
相关推荐
本教程将详细介绍如何利用Android的Wheel Control组件实现一个类似iPhone中PackView风格的三级城市底部弹出菜单。这个菜单允许用户通过滑动来选择不同级别的城市,提供了一种直观且易用的选择方式。 首先,我们来...
在网页设计中,"滚动条到底部弹出div"是一种常见的交互效果,它通常用于实现无限滚动、加载更多内容或显示底部菜单等场景。这个功能是通过JavaScript和CSS结合实现的,下面我们将详细探讨如何实现这个效果。 首先,...
在本文中,我们将深入探讨如何使用jQuery来实现微信风格的手机端底部弹出导航菜单列表。这个功能在移动设备上非常常见,它提供了一种优雅的方式,让用户在狭小的屏幕上方便地访问网站的主要功能。 首先,让我们了解...
遮罩优先级在弹出框之下; 弹出框内标签的设置; 滚动栏滚动条的隐藏 如何解决? 弹性布局,横向,三者平分整栏; 状态监听点击事件,数据控制hide或者show,通过rgba设置透明度 弹出框设置z-index; 弹性布局...
在微信小程序中,为了提供丰富的用户交互体验,开发者往往需要实现各种自定义组件,其中就包括了从底部弹起的滚动选择器。这个自定义组件在许多场景下都非常实用,比如设置选项、日期选择等。 1. **自定义标题** ...
本教程将介绍如何利用`WheelView`结合`Dialog`来实现一个底部弹出的滑动选择器,该实现方式代码简洁,易于理解,可以直接应用到你的项目中。 首先,我们来了解`WheelView`。`WheelView`是Android中的一个可滚动视图...
网页模板设计中,jQuery的运用可以为用户带来丰富的交互体验,尤其在实现滚动到网站页面底部时自动弹出对话框的功能上,它显示了强大的功能和灵活性。这个压缩包文件"网页模板——jQuery实现滚动到网站页面底部动画...
【安卓城市三级滚动选择】是一种常见的用户界面组件,在Android应用开发中被广泛用于提供用户一个交互式的、层次化的选择城市的方式。通常,这种选择器包括省份、城市和区县三个层级,用户可以通过逐级滚动来选取...
在这个场景中,我们要实现的是从屏幕底部弹出的PopupWindow,并带有滑动动画效果,类似于sharesdk的分享页面那种平滑的过渡。 首先,我们需要了解PopupWindow的基本用法。PopupWindow类提供了创建和显示自定义视图...
在IT领域,鼠标控制菜单选择弹出是一种常见的交互设计技术,它使得用户可以通过鼠标操作来激活和导航应用程序的菜单系统。这种技术广泛应用于各种软件、网页和操作系统中,旨在提高用户体验,使用户能够更直观、高效...
在本项目中,"android-pickers-master"是一个用于实现这种功能的开源库,它提供了多种类型的底部弹出选择器,包括单项选择、时间选择、日期选择、地区选择、城市选择以及联动选择等。 1. **单项选择器**:单项选择...
在Android应用开发中,"年月日时分秒底部弹出的时间选择器"是一个常见的功能需求,用于用户方便地选取特定的时间。这种选择器通常采用BottomSheetDialog的形式展示,它是一种从屏幕底部滑动出现的对话框,可以展示多...
这种样式在鼠标悬停时,三级菜单以弹出框的形式出现。弹出框的位置可以通过CSS定位实现,同时可以利用CSS3的`transform`属性进行平滑动画效果。JavaScript可以用于检测鼠标移动,以保持弹出框在鼠标附近显示。 4. ...
这个设计模式通常用于提供用户在屏幕底部触发的操作选择,当用户点击或滑动某个触发区域时,一个菜单会从底部向上滑动弹出,展示一系列可选的功能或操作。这种设计方式旨在提高用户体验,因为它们将关键操作置于触手...
对于模拟百度阅读的效果,可能需要实现一个从底部弹出的动画效果,这可能涉及到`transform`属性和`transition`属性的使用。 3. JavaScript 控制:为了实现菜单的弹出和隐藏,我们需要使用JavaScript。可以添加事件...
在JavaScript开发中,模拟APP底部弹出菜单是一项常见的任务,特别是在构建Web应用时,为了提供类似原生APP的用户体验。`jsappframe`项目就是针对这一需求而设计的一个框架,它能够帮助开发者轻松实现底部菜单的动态...
在WeUI中,"JS弹出选择层"是一个重要的交互元素,它通常用于实现用户需要从多个选项中进行选择的场景,比如日期选择、城市选择等。这种选择层具有良好的用户体验,因为它可以以弹出的形式展现,避免了在页面上占用...
在探讨“js自动弹出窗口下来菜单效果”的知识点时,我们不仅关注JavaScript代码本身,还应当深入了解其背后的逻辑与应用场景。这段代码展示了如何利用JavaScript创建一个动态下拉菜单,并在用户选择菜单项时自动打开...
在iOS开发中,弹出菜单(Popover)是一种常见的交互元素,它可以在用户触击某控件后以一种优雅的方式展示更多的选项。这个“IOS弹出菜单源码”项目旨在提供一个自定义的、功能丰富的弹出菜单解决方案。下面将详细...
JS Tree是一个流行的选择,它提供了一个灵活的API和丰富的自定义选项,可以创建可拖动、可搜索、可展开/折叠的树状视图,非常适合构建动态的三级菜单。 在构建这样的菜单时,开发者需要考虑以下关键知识点: 1. **...