`
chenliang1234576
  • 浏览: 196077 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

滚动选择packview风格的三级城市底部弹出菜单

阅读更多

本组件主要用到了一个开源项目 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

 

 

 

  • 大小: 15 KB
分享到:
评论

相关推荐

    利用Android Wheel Control 实现的packview风格的三级城市底部弹出菜单

    本教程将详细介绍如何利用Android的Wheel Control组件实现一个类似iPhone中PackView风格的三级城市底部弹出菜单。这个菜单允许用户通过滑动来选择不同级别的城市,提供了一种直观且易用的选择方式。 首先,我们来...

    滚动条到底部弹出div

    在网页设计中,"滚动条到底部弹出div"是一种常见的交互效果,它通常用于实现无限滚动、加载更多内容或显示底部菜单等场景。这个功能是通过JavaScript和CSS结合实现的,下面我们将详细探讨如何实现这个效果。 首先,...

    jQuery微信手机端底部弹出导航菜单列表代码

    在本文中,我们将深入探讨如何使用jQuery来实现微信风格的手机端底部弹出导航菜单列表。这个功能在移动设备上非常常见,它提供了一种优雅的方式,让用户在狭小的屏幕上方便地访问网站的主要功能。 首先,让我们了解...

    微信小程序实现弹出菜单功能

    遮罩优先级在弹出框之下; 弹出框内标签的设置; 滚动栏滚动条的隐藏 如何解决? 弹性布局,横向,三者平分整栏; 状态监听点击事件,数据控制hide或者show,通过rgba设置透明度 弹出框设置z-index; 弹性布局...

    微信小程序-自定义从底部弹起的滚动选择器

    在微信小程序中,为了提供丰富的用户交互体验,开发者往往需要实现各种自定义组件,其中就包括了从底部弹起的滚动选择器。这个自定义组件在许多场景下都非常实用,比如设置选项、日期选择等。 1. **自定义标题** ...

    WheelView底部弹出滑动选择器(对话框实现)

    本教程将介绍如何利用`WheelView`结合`Dialog`来实现一个底部弹出的滑动选择器,该实现方式代码简洁,易于理解,可以直接应用到你的项目中。 首先,我们来了解`WheelView`。`WheelView`是Android中的一个可滚动视图...

    网页模板——jQuery实现滚动到网站页面底部动画弹出对话框.zip

    网页模板设计中,jQuery的运用可以为用户带来丰富的交互体验,尤其在实现滚动到网站页面底部时自动弹出对话框的功能上,它显示了强大的功能和灵活性。这个压缩包文件"网页模板——jQuery实现滚动到网站页面底部动画...

    安卓城市三级滚动选择

    【安卓城市三级滚动选择】是一种常见的用户界面组件,在Android应用开发中被广泛用于提供用户一个交互式的、层次化的选择城市的方式。通常,这种选择器包括省份、城市和区县三个层级,用户可以通过逐级滚动来选取...

    Android从屏幕底部弹出PopupWindow

    在这个场景中,我们要实现的是从屏幕底部弹出的PopupWindow,并带有滑动动画效果,类似于sharesdk的分享页面那种平滑的过渡。 首先,我们需要了解PopupWindow的基本用法。PopupWindow类提供了创建和显示自定义视图...

    鼠标控制菜单选择弹出

    在IT领域,鼠标控制菜单选择弹出是一种常见的交互设计技术,它使得用户可以通过鼠标操作来激活和导航应用程序的菜单系统。这种技术广泛应用于各种软件、网页和操作系统中,旨在提高用户体验,使用户能够更直观、高效...

    底部弹出选择器

    在本项目中,"android-pickers-master"是一个用于实现这种功能的开源库,它提供了多种类型的底部弹出选择器,包括单项选择、时间选择、日期选择、地区选择、城市选择以及联动选择等。 1. **单项选择器**:单项选择...

    年月日时分秒底部弹出的时间选择器

    在Android应用开发中,"年月日时分秒底部弹出的时间选择器"是一个常见的功能需求,用于用户方便地选取特定的时间。这种选择器通常采用BottomSheetDialog的形式展示,它是一种从屏幕底部滑动出现的对话框,可以展示多...

    几种三级菜单样式例子

    这种样式在鼠标悬停时,三级菜单以弹出框的形式出现。弹出框的位置可以通过CSS定位实现,同时可以利用CSS3的`transform`属性进行平滑动画效果。JavaScript可以用于检测鼠标移动,以保持弹出框在鼠标附近显示。 4. ...

    底部上弹菜单

    这个设计模式通常用于提供用户在屏幕底部触发的操作选择,当用户点击或滑动某个触发区域时,一个菜单会从底部向上滑动弹出,展示一系列可选的功能或操作。这种设计方式旨在提高用户体验,因为它们将关键操作置于触手...

    弹出式菜单

    对于模拟百度阅读的效果,可能需要实现一个从底部弹出的动画效果,这可能涉及到`transform`属性和`transition`属性的使用。 3. JavaScript 控制:为了实现菜单的弹出和隐藏,我们需要使用JavaScript。可以添加事件...

    jsappframe:模拟APP底部弹出菜单

    在JavaScript开发中,模拟APP底部弹出菜单是一项常见的任务,特别是在构建Web应用时,为了提供类似原生APP的用户体验。`jsappframe`项目就是针对这一需求而设计的一个框架,它能够帮助开发者轻松实现底部菜单的动态...

    WeUI JS弹出选择层,带滚动,非JQ

    在WeUI中,"JS弹出选择层"是一个重要的交互元素,它通常用于实现用户需要从多个选项中进行选择的场景,比如日期选择、城市选择等。这种选择层具有良好的用户体验,因为它可以以弹出的形式展现,避免了在页面上占用...

    js 自动弹出窗口 下来菜单效果

    在探讨“js自动弹出窗口下来菜单效果”的知识点时,我们不仅关注JavaScript代码本身,还应当深入了解其背后的逻辑与应用场景。这段代码展示了如何利用JavaScript创建一个动态下拉菜单,并在用户选择菜单项时自动打开...

    IOS弹出菜单源码

    在iOS开发中,弹出菜单(Popover)是一种常见的交互元素,它可以在用户触击某控件后以一种优雅的方式展示更多的选项。这个“IOS弹出菜单源码”项目旨在提供一个自定义的、功能丰富的弹出菜单解决方案。下面将详细...

    漂亮三级菜单 导航菜单 菜单

    JS Tree是一个流行的选择,它提供了一个灵活的API和丰富的自定义选项,可以创建可拖动、可搜索、可展开/折叠的树状视图,非常适合构建动态的三级菜单。 在构建这样的菜单时,开发者需要考虑以下关键知识点: 1. **...

Global site tag (gtag.js) - Google Analytics