精华内容
下载资源
问答
  • 本示例完整实现了自定义下拉菜单的功能,初学者可快速掌握自定义下拉菜单的技巧,有关具体的实现细节请参考博文:http://blog.csdn.net/l1028386804/article/details/48101651
  • android自定义下拉菜单

    2012-12-21 17:36:04
    大方简单的下拉菜单,没有做多余的修饰,但功能齐全
  • android 自定义下拉菜单

    万次阅读 2016-07-20 14:15:26
    本实例的自定义下拉菜单主要是继承PopupWindow类来实现的弹出窗体,各种布局效果可以根据自己定义设计。弹出的动画效果主要用到了translate、alpha、scale,具体实现步骤如下:  先上效果图如下:左边下拉菜单、...

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

             先上效果图如下:左边下拉菜单、中间下拉菜单、右边下拉菜单

                     

    1.主界面布局 activity_main.xml:

    [html]  view plain  copy
    1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     xmlns:tools="http://schemas.android.com/tools"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent"  
    5.     android:background="#ffffff" >  
    6.   
    7.     <include  
    8.         android:id="@+id/main_top"  
    9.         android:layout_width="match_parent"  
    10.         android:layout_height="wrap_content"  
    11.         layout="@layout/urm_top" />  
    12.   
    13.     <TextView  
    14.         android:id="@+id/rule_line_tv"  
    15.         android:layout_width="match_parent"  
    16.         android:layout_height="0.5dp"  
    17.         android:layout_below="@id/main_top"  
    18.         android:background="@color/reserve_line" />  
    19.   
    20.     <LinearLayout  
    21.         android:id="@+id/main_ll"  
    22.         android:layout_width="match_parent"  
    23.         android:layout_height="wrap_content"  
    24.         android:layout_below="@id/rule_line_tv"  
    25.         android:gravity="center_vertical"  
    26.         android:orientation="horizontal"  
    27.         android:padding="10dp" >  
    28.   
    29.         <TextView  
    30.             android:id="@+id/left_tv"  
    31.             android:layout_width="0dp"  
    32.             android:layout_height="wrap_content"  
    33.             android:layout_weight="1"  
    34.             android:ellipsize="end"  
    35.             android:gravity="center_horizontal"  
    36.             android:maxLength="4"  
    37.             android:singleLine="true"  
    38.             android:text="我负责的线索" />  
    39.   
    40.         <TextView  
    41.             android:id="@+id/middle_tv"  
    42.             android:layout_width="0dp"  
    43.             android:layout_height="wrap_content"  
    44.             android:layout_weight="1"  
    45.             android:ellipsize="end"  
    46.             android:gravity="center_horizontal"  
    47.             android:maxLength="4"  
    48.             android:singleLine="true"  
    49.             android:text="团队" />  
    50.   
    51.         <TextView  
    52.             android:id="@+id/right_tv"  
    53.             android:layout_width="0dp"  
    54.             android:layout_height="wrap_content"  
    55.             android:layout_weight="1"  
    56.             android:ellipsize="end"  
    57.             android:gravity="center_horizontal"  
    58.             android:maxLength="4"  
    59.             android:singleLine="true"  
    60.             android:text="自定义" />  
    61.     </LinearLayout>  
    62.   
    63.     <TextView  
    64.         android:id="@+id/rule_line01_tv"  
    65.         android:layout_width="match_parent"  
    66.         android:layout_height="0.5dp"  
    67.         android:layout_below="@id/main_ll"  
    68.         android:background="@color/reserve_line" />  
    69.   
    70.     <TextView  
    71.         android:id="@+id/main_tv"  
    72.         android:layout_width="wrap_content"  
    73.         android:layout_height="wrap_content"  
    74.         android:layout_centerInParent="true"  
    75.         android:text="主界面" />  
    76.   
    77. </RelativeLayout>  

    2.主界面测试类 MainActivity.java

    [java]  view plain  copy
    1. package com.popuptest;  
    2.   
    3. import java.util.ArrayList;  
    4. import android.os.Bundle;  
    5. import android.util.DisplayMetrics;  
    6. import android.view.View;  
    7. import android.view.View.OnClickListener;  
    8. import android.view.Window;  
    9. import android.widget.AdapterView;  
    10. import android.widget.Button;  
    11. import android.widget.ImageButton;  
    12. import android.widget.ImageView;  
    13. import android.widget.LinearLayout;  
    14. import android.widget.TextView;  
    15. import android.widget.AdapterView.OnItemClickListener;  
    16. import android.widget.RelativeLayout.LayoutParams;  
    17. import android.app.Activity;  
    18.   
    19. public class MainActivity extends Activity implements OnClickListener {  
    20.   
    21.     public static int screenW, screenH;  
    22.   
    23.     private ImageButton backBtn, createBtn;  
    24.     private Button confirmBtn;  
    25.     private TextView topTv;  
    26.     private LinearLayout topll;  
    27.     private ImageView topIv;  
    28.     private TextView topLineTv;  
    29.   
    30.     private TopMiddlePopup middlePopup;  
    31.   
    32.     @Override  
    33.     protected void onCreate(Bundle savedInstanceState) {  
    34.         super.onCreate(savedInstanceState);  
    35.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
    36.         setContentView(R.layout.activity_main);  
    37.         getScreenPixels();  
    38.         initWidget();  
    39.     }  
    40.   
    41.     /** 
    42.      * 初始化控件 
    43.      */  
    44.     private void initWidget() {  
    45.         backBtn = (ImageButton) findViewById(R.id.urm_back_btn);  
    46.         createBtn = (ImageButton) findViewById(R.id.urm_create_btn);  
    47.         confirmBtn = (Button) findViewById(R.id.urm_confirm_btn);  
    48.   
    49.         topll = (LinearLayout) findViewById(R.id.urm_top_ll);  
    50.         topIv = (ImageView) findViewById(R.id.urm_top_iv);  
    51.   
    52.         topLineTv = (TextView) findViewById(R.id.rule_line_tv);  
    53.   
    54.         topTv = (TextView) findViewById(R.id.urm_top_tv);  
    55.         topTv.setText("企业客户");  
    56.   
    57.         backBtn.setOnClickListener(this);  
    58.         createBtn.setOnClickListener(this);  
    59.         confirmBtn.setOnClickListener(this);  
    60.         topll.setOnClickListener(this);  
    61.   
    62.     }  
    63.   
    64.     /** 
    65.      * 设置弹窗 
    66.      *  
    67.      * @param type 
    68.      */  
    69.     private void setPopup(int type) {  
    70.         middlePopup = new TopMiddlePopup(MainActivity.this, screenW, screenH,  
    71.                 onItemClickListener, getItemsName(), type);  
    72.     }  
    73.   
    74.     /** 
    75.      * 设置弹窗内容 
    76.      *  
    77.      * @return 
    78.      */  
    79.     private ArrayList<String> getItemsName() {  
    80.         ArrayList<String> items = new ArrayList<String>();  
    81.         items.add("企业客户");  
    82.         items.add("集团客户");  
    83.         items.add("公海客户");  
    84.         return items;  
    85.     }  
    86.   
    87.     @Override  
    88.     public void onClick(View v) {  
    89.         switch (v.getId()) {  
    90.         case R.id.urm_back_btn:  
    91.             setPopup(1);  
    92.             middlePopup.show(topLineTv);  
    93.             break;  
    94.         case R.id.urm_create_btn:  
    95.             setPopup(2);  
    96.             middlePopup.show(topLineTv);  
    97.             break;  
    98.         case R.id.urm_confirm_btn:  
    99.   
    100.             break;  
    101.         case R.id.urm_top_ll:  
    102.             setPopup(0);  
    103.             middlePopup.show(topLineTv);  
    104.             break;  
    105.         }  
    106.     }  
    107.   
    108.     /** 
    109.      * 弹窗点击事件 
    110.      */  
    111.     private OnItemClickListener onItemClickListener = new OnItemClickListener() {  
    112.   
    113.         @Override  
    114.         public void onItemClick(AdapterView<?> parent, View view, int position,  
    115.                 long id) {  
    116.             System.out.println("--onItemClickListener--:");  
    117.             middlePopup.dismiss();  
    118.         }  
    119.     };  
    120.   
    121.     /** 
    122.      * 获取屏幕的宽和高 
    123.      */  
    124.     public void getScreenPixels() {  
    125.         DisplayMetrics metrics = new DisplayMetrics();  
    126.         getWindowManager().getDefaultDisplay().getMetrics(metrics);  
    127.         screenW = metrics.widthPixels;  
    128.         screenH = metrics.heightPixels;  
    129.     }  
    130.   
    131. }  

    3.自定义弹窗类 TopMiddlePopup.java

    [java]  view plain  copy
    1. package com.popuptest;  
    2.   
    3. import java.util.ArrayList;  
    4. import android.content.Context;  
    5. import android.graphics.drawable.ColorDrawable;  
    6. import android.view.LayoutInflater;  
    7. import android.view.MotionEvent;  
    8. import android.view.View;  
    9. import android.view.View.OnTouchListener;  
    10. import android.view.ViewGroup.LayoutParams;  
    11. import android.widget.LinearLayout;  
    12. import android.widget.ListView;  
    13. import android.widget.PopupWindow;  
    14. import android.widget.AdapterView.OnItemClickListener;  
    15.   
    16. public class TopMiddlePopup extends PopupWindow {  
    17.   
    18.     private Context myContext;  
    19.     private ListView myLv;  
    20.     private OnItemClickListener myOnItemClickListener;  
    21.     private ArrayList<String> myItems;  
    22.     private int myWidth;  
    23.     private int myHeight;  
    24.     private int myType;  
    25.   
    26.     // 判断是否需要添加或更新列表子类项  
    27.     private boolean myIsDirty = true;  
    28.   
    29.     private LayoutInflater inflater = null;  
    30.     private View myMenuView;  
    31.   
    32.     private LinearLayout popupLL;  
    33.   
    34.     private PopupAdapter adapter;  
    35.   
    36.     public TopMiddlePopup(Context context) {  
    37.         // TODO Auto-generated constructor stub  
    38.     }  
    39.   
    40.     public TopMiddlePopup(Context context, int width, int height,  
    41.             OnItemClickListener onItemClickListener, ArrayList<String> items,  
    42.             int type) {  
    43.   
    44.         inflater = (LayoutInflater) context  
    45.                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
    46.         myMenuView = inflater.inflate(R.layout.top_popup, null);  
    47.   
    48.         this.myContext = context;  
    49.         this.myItems = items;  
    50.         this.myOnItemClickListener = onItemClickListener;  
    51.         this.myType = type;  
    52.   
    53.         this.myWidth = width;  
    54.         this.myHeight = height;  
    55.   
    56.         System.out.println("--myWidth--:" + myWidth + "--myHeight--:"  
    57.                 + myHeight);  
    58.         initWidget();  
    59.         setPopup();  
    60.     }  
    61.   
    62.     /** 
    63.      * 初始化控件 
    64.      */  
    65.     private void initWidget() {  
    66.         myLv = (ListView) myMenuView.findViewById(R.id.popup_lv);  
    67.         popupLL = (LinearLayout) myMenuView.findViewById(R.id.popup_layout);  
    68.         myLv.setOnItemClickListener(myOnItemClickListener);  
    69.   
    70.         if (myType == 1) {  
    71.             android.widget.RelativeLayout.LayoutParams lpPopup = (android.widget.RelativeLayout.LayoutParams) popupLL  
    72.                     .getLayoutParams();  
    73.             lpPopup.width = (int) (myWidth * 1.0 / 4);  
    74.             lpPopup.setMargins(00, (int) (myWidth * 3.0 / 4), 0);  
    75.             popupLL.setLayoutParams(lpPopup);  
    76.         } else if (myType == 2) {  
    77.             android.widget.RelativeLayout.LayoutParams lpPopup = (android.widget.RelativeLayout.LayoutParams) popupLL  
    78.                     .getLayoutParams();  
    79.             lpPopup.width = (int) (myWidth * 1.0 / 4);  
    80.             lpPopup.setMargins((int) (myWidth * 3.0 / 4), 000);  
    81.             popupLL.setLayoutParams(lpPopup);  
    82.         }  
    83.     }  
    84.   
    85.     /** 
    86.      * 设置popup的样式 
    87.      */  
    88.     private void setPopup() {  
    89.         // 设置AccessoryPopup的view  
    90.         this.setContentView(myMenuView);  
    91.         // 设置AccessoryPopup弹出窗体的宽度  
    92.         this.setWidth(LayoutParams.MATCH_PARENT);  
    93.         // 设置AccessoryPopup弹出窗体的高度  
    94.         this.setHeight(LayoutParams.MATCH_PARENT);  
    95.         // 设置AccessoryPopup弹出窗体可点击  
    96.         this.setFocusable(true);  
    97.         // 设置AccessoryPopup弹出窗体的动画效果  
    98.         if (myType == 1) {  
    99.             this.setAnimationStyle(R.style.AnimTopLeft);  
    100.         } else if (myType == 2) {  
    101.             this.setAnimationStyle(R.style.AnimTopRight);  
    102.         } else {  
    103.             //this.setAnimationStyle(R.style.AnimTop);  
    104.             this.setAnimationStyle(R.style.AnimTopMiddle);  
    105.         }  
    106.         // 实例化一个ColorDrawable颜色为半透明  
    107.         ColorDrawable dw = new ColorDrawable(0x33000000);  
    108.         // 设置SelectPicPopupWindow弹出窗体的背景  
    109.         this.setBackgroundDrawable(dw);  
    110.   
    111.         myMenuView.setOnTouchListener(new OnTouchListener() {  
    112.   
    113.             @Override  
    114.             public boolean onTouch(View v, MotionEvent event) {  
    115.   
    116.                 int height = popupLL.getBottom();  
    117.                 int left = popupLL.getLeft();  
    118.                 int right = popupLL.getRight();  
    119.                 System.out.println("--popupLL.getBottom()--:"  
    120.                         + popupLL.getBottom());  
    121.                 int y = (int) event.getY();  
    122.                 int x = (int) event.getX();  
    123.                 if (event.getAction() == MotionEvent.ACTION_UP) {  
    124.                     if (y > height || x < left || x > right) {  
    125.                         System.out.println("---点击位置在列表下方--");  
    126.                         dismiss();  
    127.                     }  
    128.                 }  
    129.                 return true;  
    130.             }  
    131.         });  
    132.     }  
    133.   
    134.     /** 
    135.      * 显示弹窗界面 
    136.      *  
    137.      * @param view 
    138.      */  
    139.     public void show(View view) {  
    140.         if (myIsDirty) {  
    141.             myIsDirty = false;  
    142.             adapter = new PopupAdapter(myContext, myItems, myType);  
    143.             myLv.setAdapter(adapter);  
    144.         }  
    145.   
    146.         showAsDropDown(view, 00);  
    147.     }  
    148.   
    149. }  

    4.自定义弹窗布局 top_popup.xml

    [html]  view plain  copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent" >  
    5.   
    6.     <LinearLayout  
    7.         android:id="@+id/popup_layout"  
    8.         android:layout_width="match_parent"  
    9.         android:layout_height="wrap_content"  
    10.         android:layout_alignParentTop="true"  
    11.         android:background="#ffffff"  
    12.         android:orientation="vertical" >  
    13.   
    14.         <ListView  
    15.             android:id="@+id/popup_lv"  
    16.             android:layout_width="match_parent"  
    17.             android:layout_height="match_parent"  
    18.             android:divider="@color/content_line"  
    19.             android:dividerHeight="0.5dp" >  
    20.         </ListView>  
    21.   
    22.         <TextView  
    23.             android:layout_width="match_parent"  
    24.             android:layout_height="0.5dp"  
    25.             android:background="@color/reserve_line" />  
    26.     </LinearLayout>  
    27.   
    28. </RelativeLayout>  

    5.弹窗类表适配器类 PopupAdapter

    [java]  view plain  copy
    1. package com.popuptest;  
    2.   
    3. import java.util.ArrayList;  
    4. import android.content.Context;  
    5. import android.view.Gravity;  
    6. import android.view.LayoutInflater;  
    7. import android.view.View;  
    8. import android.view.ViewGroup;  
    9. import android.widget.BaseAdapter;  
    10. import android.widget.RelativeLayout.LayoutParams;  
    11. import android.widget.TextView;  
    12.   
    13. public class PopupAdapter extends BaseAdapter {  
    14.     private Context myContext;  
    15.     private LayoutInflater inflater;  
    16.     private ArrayList<String> myItems;  
    17.     private int myType;  
    18.   
    19.     public PopupAdapter(Context context, ArrayList<String> items, int type) {  
    20.         this.myContext = context;  
    21.         this.myItems = items;  
    22.         this.myType = type;  
    23.   
    24.         inflater = LayoutInflater.from(myContext);  
    25.   
    26.     }  
    27.   
    28.     @Override  
    29.     public int getCount() {  
    30.         return myItems.size();  
    31.     }  
    32.   
    33.     @Override  
    34.     public String getItem(int position) {  
    35.         return myItems.get(position);  
    36.     }  
    37.   
    38.     @Override  
    39.     public long getItemId(int position) {  
    40.         return 0;  
    41.     }  
    42.   
    43.     @Override  
    44.     public View getView(int position, View convertView, ViewGroup parent) {  
    45.         PopupHolder holder = null;  
    46.         if (convertView == null) {  
    47.             holder = new PopupHolder();  
    48.             convertView = inflater.inflate(R.layout.top_popup_item, null);  
    49.             holder.itemNameTv = (TextView) convertView  
    50.                     .findViewById(R.id.popup_tv);  
    51.             if (myType == 0) {  
    52.                 holder.itemNameTv.setGravity(Gravity.CENTER);  
    53.             } else if (myType == 1) {  
    54.                 holder.itemNameTv.setGravity(Gravity.LEFT);  
    55.             } else if (myType == 2) {  
    56.                 holder.itemNameTv.setGravity(Gravity.RIGHT);  
    57.             }  
    58.             convertView.setTag(holder);  
    59.         } else {  
    60.             holder = (PopupHolder) convertView.getTag();  
    61.         }  
    62.         String itemName = getItem(position);  
    63.         holder.itemNameTv.setText(itemName);  
    64.         return convertView;  
    65.     }  
    66.   
    67.     private class PopupHolder {  
    68.         TextView itemNameTv;  
    69.     }  
    70.   
    71. }  

    6.子item布局 top_popup_item.xml

    [html]  view plain  copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="wrap_content"  
    5.     android:background="#ffffff"  
    6.     android:padding="10dp" >  
    7.   
    8.     <TextView  
    9.         android:id="@+id/popup_tv"  
    10.         android:layout_width="match_parent"  
    11.         android:layout_height="wrap_content"   
    12.         style="@style/urm_tv"/>  
    13.   
    14. </RelativeLayout>  

    7.主界面顶部布局 urm_top.xml

    [html]  view plain  copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="wrap_content"  
    5.     android:background="#eeeeee" >  
    6.   
    7.     <ImageButton  
    8.         android:id="@+id/urm_back_btn"  
    9.         android:layout_width="wrap_content"  
    10.         android:layout_height="wrap_content"  
    11.         android:layout_alignParentLeft="true"  
    12.         android:background="@null"  
    13.         android:contentDescription="@string/app_name"  
    14.         android:src="@drawable/back" />  
    15.   
    16.     <LinearLayout  
    17.         android:id="@+id/urm_top_ll"  
    18.         android:layout_width="wrap_content"  
    19.         android:layout_height="wrap_content"  
    20.         android:layout_centerInParent="true"  
    21.         android:gravity="center_vertical"  
    22.         android:orientation="horizontal" >  
    23.   
    24.         <TextView  
    25.             android:id="@+id/urm_top_tv"  
    26.             style="@style/main_tv_style"  
    27.             android:layout_width="wrap_content"  
    28.             android:layout_height="wrap_content"  
    29.             android:text="企业客户" />  
    30.   
    31.         <ImageView  
    32.             android:id="@+id/urm_top_iv"  
    33.             android:layout_width="wrap_content"  
    34.             android:layout_height="wrap_content"  
    35.             android:layout_marginLeft="5dp"  
    36.             android:background="@null"  
    37.             android:contentDescription="@string/app_name"  
    38.             android:src="@drawable/switch02" />  
    39.     </LinearLayout>  
    40.   
    41.     <RelativeLayout  
    42.         android:id="@+id/urm_top_right_rl"  
    43.         android:layout_width="wrap_content"  
    44.         android:layout_height="wrap_content"  
    45.         android:layout_alignParentRight="true"  
    46.         android:layout_centerVertical="true" >  
    47.   
    48.         <ImageButton  
    49.             android:id="@+id/urm_create_btn"  
    50.             android:layout_width="wrap_content"  
    51.             android:layout_height="wrap_content"  
    52.             android:background="@null"  
    53.             android:contentDescription="@string/app_name"  
    54.             android:src="@drawable/btn_add_2x" />  
    55.   
    56.         <Button  
    57.             android:id="@+id/urm_confirm_btn"  
    58.             android:layout_width="wrap_content"  
    59.             android:layout_height="wrap_content"  
    60.             android:background="@null"  
    61.             android:gravity="center_vertical"  
    62.             android:padding="10dp"  
    63.             android:text="确定"  
    64.             android:textColor="@color/blue2"  
    65.             android:textSize="18sp"  
    66.             android:visibility="gone" />  
    67.     </RelativeLayout>  
    68.   
    69.     <ImageButton  
    70.         android:id="@+id/urm_search_btn"  
    71.         android:layout_width="wrap_content"  
    72.         android:layout_height="wrap_content"  
    73.         android:layout_centerVertical="true"  
    74.         android:layout_toLeftOf="@id/urm_top_right_rl"  
    75.         android:background="@null"  
    76.         android:contentDescription="@string/app_name"  
    77.         android:src="@drawable/search"  
    78.         android:visibility="gone" />  
    79.   
    80. </RelativeLayout>  

    8.styles.xml文件

    [html]  view plain  copy
    1. <resources>  
    2.   
    3.     <!--  
    4.         Base application theme, dependent on API level. This theme is replaced  
    5.         by AppBaseTheme from res/values-vXX/styles.xml on newer devices.  
    6.     -->  
    7.     <style name="AppBaseTheme" parent="android:Theme.Light">  
    8.         <!--  
    9.             Theme customizations available in newer API levels can go in  
    10.             res/values-vXX/styles.xml, while customizations related to  
    11.             backward-compatibility can go here.  
    12.         -->  
    13.     </style>  
    14.   
    15.     <!-- Application theme. -->  
    16.     <style name="AppTheme" parent="AppBaseTheme">  
    17.         <!-- All customizations that are NOT specific to a particular API-level can go here. -->  
    18.     </style>  
    19.       
    20.     <style name="AnimTop" parent="@android:style/Animation">  
    21.         <item name="android:windowEnterAnimation">@anim/push_top_in</item>  
    22.         <item name="android:windowExitAnimation">@anim/push_top_out</item>  
    23.     </style>  
    24.       
    25.      <style name="AnimTopRight" parent="@android:style/Animation">  
    26.         <item name="android:windowEnterAnimation">@anim/top_right_in</item>  
    27.         <item name="android:windowExitAnimation">@anim/top_right_out</item>  
    28.     </style>  
    29.       
    30.      <style name="AnimTopLeft" parent="@android:style/Animation">  
    31.         <item name="android:windowEnterAnimation">@anim/top_left_in</item>  
    32.         <item name="android:windowExitAnimation">@anim/top_left_out</item>  
    33.     </style>  
    34.       
    35.      <style name="AnimTopMiddle" parent="@android:style/Animation">  
    36.         <item name="android:windowEnterAnimation">@anim/top_middle_in</item>  
    37.         <item name="android:windowExitAnimation">@anim/top_middle_out</item>  
    38.     </style>  
    39.       
    40.     <style name="main_tv_style">  
    41.         <item name="android:textSize">20sp</item>  
    42.         <item name="android:textColor">#000000</item>  
    43.     </style>  
    44.   
    45.     <style name="urm_tv">  
    46.         <item name="android:textSize">18sp</item>  
    47.     </style>  
    48. </resources>  

    9.各种动画效果

    push_top_in.xml

    [html]  view plain  copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <!-- 从屏幕上面进入 -->  
    3. <set xmlns:android="http://schemas.android.com/apk/res/android" >  
    4.   
    5.     <translate  
    6.         android:duration="500"  
    7.         android:fromYDelta="-100%p"  
    8.         android:toYDelta="0" />  
    9.   
    10.     <alpha  
    11.         android:duration="500"  
    12.         android:fromAlpha="0.0"  
    13.         android:toAlpha="1.0" />  
    14.   
    15. </set>  

    push_top_out.xml

    [html]  view plain  copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <!-- 从屏幕上面退出 -->  
    3. <set xmlns:android="http://schemas.android.com/apk/res/android" >  
    4.   
    5.     <translate  
    6.         android:duration="500"  
    7.         android:fromYDelta="0"  
    8.         android:toYDelta="-100%p" />  
    9.   
    10.     <alpha  
    11.         android:duration="500"  
    12.         android:fromAlpha="1.0"  
    13.         android:toAlpha="0.0" />  
    14.   
    15. </set>  

    top_left_in.xml

    [html]  view plain  copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
    3.   
    4.     <scale  
    5.         android:duration="500"  
    6.         android:fillAfter="false"  
    7.         android:fromXScale="0.0"  
    8.         android:fromYScale="0.0"  
    9.         android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    10.         android:pivotX="0%"  
    11.         android:pivotY="0%"  
    12.         android:toXScale="1.0"  
    13.         android:toYScale="1.0" />  
    14.   
    15. </set>  

    top_left_out.xml

    [html]  view plain  copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <set xmlns:android="http://schemas.android.com/apk/res/android" >  
    3.   
    4.     <scale  
    5.         android:duration="500"  
    6.         android:fillAfter="false"  
    7.         android:fromXScale="1.0"  
    8.         android:fromYScale="1.0"  
    9.         android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    10.         android:pivotX="0%"  
    11.         android:pivotY="0%"  
    12.         android:toXScale="0.0"  
    13.         android:toYScale="0.0" />  
    14.   
    15. </set>  

    top_middle_in.xml

    [html]  view plain  copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
    3.   
    4.     <scale  
    5.         android:duration="500"  
    6.         android:fillAfter="false"  
    7.         android:fromXScale="0.0"  
    8.         android:fromYScale="0.0"  
    9.         android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    10.         android:pivotX="50%"  
    11.         android:pivotY="0%"  
    12.         android:toXScale="1.0"  
    13.         android:toYScale="1.0" />  
    14.   
    15. </set>  

    top_middle_out.xml

    [html]  view plain  copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <set xmlns:android="http://schemas.android.com/apk/res/android" >  
    3.   
    4.     <scale  
    5.         android:duration="500"  
    6.         android:fillAfter="false"  
    7.         android:fromXScale="1.0"  
    8.         android:fromYScale="1.0"  
    9.         android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    10.         android:pivotX="50%"  
    11.         android:pivotY="0%"  
    12.         android:toXScale="0.0"  
    13.         android:toYScale="0.0" />  
    14.   
    15. </set>  

    top_right_in.xml

    [html]  view plain  copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
    3.   
    4.     <scale  
    5.         android:duration="500"  
    6.         android:fillAfter="false"  
    7.         android:fromXScale="0.0"  
    8.         android:fromYScale="0.0"  
    9.         android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    10.         android:pivotX="100%"  
    11.         android:pivotY="0%"  
    12.         android:toXScale="1.0"  
    13.         android:toYScale="1.0" />  
    14.   
    15. </set>  

    top_right_out.xml

    [html]  view plain  copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <set xmlns:android="http://schemas.android.com/apk/res/android" >  
    3.   
    4.     <scale  
    5.         android:duration="500"  
    6.         android:fillAfter="false"  
    7.         android:fromXScale="1.0"  
    8.         android:fromYScale="1.0"  
    9.         android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    10.         android:pivotX="100%"  
    11.         android:pivotY="0%"  
    12.         android:toXScale="0.0"  
    13.         android:toYScale="0.0" />  
    14.   
    15. </set>  

    运行项目即可搞定!
    展开全文
  • Android自定义view实现下拉筛选菜单(仿美团下拉),源代码地址 http://www.ytsyt.cn/post/12.html
  • Android之——自定义下拉菜单的实现

    万次阅读 2015-08-30 09:14:40
    做过Android开发的童鞋,一般都会遇到这样一种情况,就是Android中原有的下拉控件Spinner过于单调和简单,不能够满足我们实际开发的需求了,这时候就需要我们自己自定义下拉菜单来实现相应的功能,那么,如何实现...
    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48101651
    

    做过Android开发的童鞋,一般都会遇到这样一种情况,就是Android中原有的下拉控件Spinner过于单调和简单,不能够满足我们实际开发的需求了,这时候就需要我们自己自定义下拉菜单来实现相应的功能,那么,如何实现自定义下拉菜单呢?下面我就来和大家一起实现这个功能。

    一、原理

    我们这个下拉菜单展示的内容主要以ListView实现,在界面上放置一个文本框,文本框右侧放置一个向下的箭头图标,表示可以点击下拉。然后创建一个item.xml布局文件,这个布局文件展示的就是ListView的条目信息,条目中有一个图片,表示头像,一串数字表示qq号(暂时以显示qq号为例),后面一个删除按钮。所有的数据封装在ListView中。然后我们将这个ListView以PopupWindow的形式显示在文本框的下面。

    当ListView不显示的时候,点击文本框右侧的下拉图标,则弹出PopupWindow显示ListView

    当ListView显示的时候,点击文本框右侧的下拉图标,则隐藏PopupWindow从而隐藏ListView

    点击ListView中每一个条目后删除图标的时候,相应的条目就会从listView中消失。

    二、实现

    1、MainActivity

    程序很简单,我将所有的java代码都写在了MainActivity中,我们还是分解来看这个类。

    1)属性字段

    每个字段代表的含义见代码注释

    具体代码实现如下:

    //界面控件
    private ImageButton spinner;
    private EditText et_name;
    //构造qq号用到的集合
    private List<String> names = new ArrayList<String>();
    //布局加载器
    private LayoutInflater mInflater;
    //自定义适配器
    private MyAdapter mAdapter;
    //PopupWindow
    private PopupWindow pop;
    //是否显示PopupWindow,默认不显示
    private boolean isPopShow = false;

    2)自定义Adapter

    同样,为了在ListView中更好的显示数据,我们还是用到了自定义Adapter

    具体代码实现如下:

    /**
     * 自定义Adapter
     * @author liuyazhuang
     *
     */
    private class MyAdapter extends BaseAdapter{
    
    	@Override
    	public int getCount() {
    		// TODO Auto-generated method stub
    		return names.size();
    	}
    
    	@Override
    	public Object getItem(int position) {
    		// TODO Auto-generated method stub
    		return names.get(position);
    	}
    
    	@Override
    	public long getItemId(int position) {
    		// TODO Auto-generated method stub
    		return position;
    	}
    
    	@Override
    	public View getView(final int position, View convertView, ViewGroup parent) {
    		View view = mInflater.inflate(R.layout.item, null);
    		final TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
    		tv_name.setText(names.get(position));
    		ImageButton delete = (ImageButton) view.findViewById(R.id.delete);
    		//设置按钮的监听事件
    		delete.setOnClickListener(new View.OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				names.remove(position);
    				isPopShow = true;
    				mAdapter.notifyDataSetChanged();
    			}
    		});
    		//设置按钮的监听事件
    		tv_name.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				et_name.setText(names.get(position));
    				pop.dismiss();
    			}
    		});
    		return view;
    	}
    	
    } 

    3)onCreate方法

    这个方法中主要实现的功能就是,初始化界面布局,为属性字段赋值,构造要在ListView中显示的数据,同时为相应的按钮设置点击事件,控制PopupWindow的显示和隐藏。

    具体实现代码如下:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.activity_main);
    	//构造qq账号
    	for(int i = 10000; i < 10030; i++){
    		names.add(String.valueOf(i));
    	}
    	spinner = (ImageButton) findViewById(R.id.spinner);
    	et_name = (EditText) findViewById(R.id.et_name);
    	mInflater = LayoutInflater.from(MainActivity.this);
    	mAdapter = new MyAdapter();
    	spinner.setOnClickListener(new View.OnClickListener() {
    
    		@Override
    		public void onClick(View v) {
    			// TODO Auto-generated method stub
    			if(pop == null){
    				ListView listView = new ListView(MainActivity.this);
    				listView.setCacheColorHint(0x00000000);
    				listView.setAdapter(mAdapter);
    				pop = new PopupWindow(listView, et_name.getWidth(), LayoutParams.WRAP_CONTENT, true);
    				pop.setBackgroundDrawable(new ColorDrawable(0x00000000));
    				isPopShow = true;
    			}
    			if(isPopShow){
    				pop.showAsDropDown(et_name, 0, 0);
    				isPopShow = false;
    			}else{
    				pop.dismiss();
    				isPopShow = true;
    			}
    		}
    	});
    }

    4)完整代码如下:

    package com.lyz.spiner.activity;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.graphics.drawable.ColorDrawable;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.BaseAdapter;
    import android.widget.EditText;
    import android.widget.ImageButton;
    import android.widget.ListView;
    import android.widget.PopupWindow;
    import android.widget.TextView;
    
    /**
     * 程序主入口
     * @author liuyazhuang
     *
     */
    public class MainActivity extends Activity {
    	//界面控件
    	private ImageButton spinner;
    	private EditText et_name;
    	//构造qq号用到的集合
    	private List<String> names = new ArrayList<String>();
    	//布局加载器
    	private LayoutInflater mInflater;
    	//自定义适配器
    	private MyAdapter mAdapter;
    	//PopupWindow
    	private PopupWindow pop;
    	//是否显示PopupWindow,默认不显示
    	private boolean isPopShow = false;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		//构造qq账号
    		for(int i = 10000; i < 10030; i++){
    			names.add(String.valueOf(i));
    		}
    		spinner = (ImageButton) findViewById(R.id.spinner);
    		et_name = (EditText) findViewById(R.id.et_name);
    		mInflater = LayoutInflater.from(MainActivity.this);
    		mAdapter = new MyAdapter();
    		spinner.setOnClickListener(new View.OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				if(pop == null){
    					ListView listView = new ListView(MainActivity.this);
    					listView.setCacheColorHint(0x00000000);
    					listView.setAdapter(mAdapter);
    					pop = new PopupWindow(listView, et_name.getWidth(), LayoutParams.WRAP_CONTENT, true);
    					pop.setBackgroundDrawable(new ColorDrawable(0x00000000));
    					isPopShow = true;
    				}
    				if(isPopShow){
    					pop.showAsDropDown(et_name, 0, 0);
    					isPopShow = false;
    				}else{
    					pop.dismiss();
    					isPopShow = true;
    				}
    			}
    		});
    	}
    	
    	/**
    	 * 自定义Adapter
    	 * @author liuyazhuang
    	 *
    	 */
    	private class MyAdapter extends BaseAdapter{
    
    		@Override
    		public int getCount() {
    			// TODO Auto-generated method stub
    			return names.size();
    		}
    
    		@Override
    		public Object getItem(int position) {
    			// TODO Auto-generated method stub
    			return names.get(position);
    		}
    
    		@Override
    		public long getItemId(int position) {
    			// TODO Auto-generated method stub
    			return position;
    		}
    
    		@Override
    		public View getView(final int position, View convertView, ViewGroup parent) {
    			View view = mInflater.inflate(R.layout.item, null);
    			final TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
    			tv_name.setText(names.get(position));
    			ImageButton delete = (ImageButton) view.findViewById(R.id.delete);
    			//设置按钮的监听事件
    			delete.setOnClickListener(new View.OnClickListener() {
    				
    				@Override
    				public void onClick(View v) {
    					// TODO Auto-generated method stub
    					names.remove(position);
    					isPopShow = true;
    					mAdapter.notifyDataSetChanged();
    				}
    			});
    			//设置按钮的监听事件
    			tv_name.setOnClickListener(new View.OnClickListener() {
    				@Override
    				public void onClick(View v) {
    					// TODO Auto-generated method stub
    					et_name.setText(names.get(position));
    					pop.dismiss();
    				}
    			});
    			return view;
    		}
    		
    	} 
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    
    }
    

    2、主布局文件activity_main.xml

    具体实现代码如下:

    <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" 
        android:background="@android:color/black">
    
        <EditText
            android:id="@+id/et_name"
            android:layout_width="200dip"
            android:layout_height="wrap_content"
    		android:layout_centerHorizontal="true"
    		android:hint="请输入账号" />
        
    	<ImageButton 
    	    android:id="@+id/spinner"
    	    android:layout_width="wrap_content"
    	    android:layout_height="wrap_content"
    	    android:background="@drawable/button"
    	    android:layout_alignTop="@id/et_name"
    	    android:layout_alignRight="@id/et_name"
    	    android:layout_alignBottom="@id/et_name"/>
    </RelativeLayout>
    

    3、条目布局文件item.xml

    具体实现代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" 
        android:gravity="center_vertical">
        <ImageView 
            android:id="@+id/header"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/user"/>
        
        <TextView 
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
        
        <ImageButton 
            android:id="@+id/delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/delete"/>
    
    </LinearLayout>
    

    4、AndroidManifest.xml

    最后贴出AndroidManifest.xml的代码

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.lyz.spiner.activity"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="18" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.lyz.spiner.activity.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    三、运行效果


    四、温馨提示

    大家可以到链接http://download.csdn.net/detail/l1028386804/9062795下载Android自定义下拉菜单示例完整源代码

    本实例中,为了方面,我把一些文字直接写在了布局文件中和相关的类中,大家在真实的项目中要把这些文字写在string.xml文件中,在外部引用这些资源,切记,这是作为一个Android程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。

    展开全文
  • android 自定义下拉菜单模式——Spinner与setDropDownViewResource
  • android自定义Spinner下拉菜单(下拉列表框)样式
  • Android自定义下拉列表PopupWindow

    千次阅读 2016-05-12 10:13:17
    自定义PopupWindow定义一个主类:package com.example.administrator.testpopuwindow;import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android....

    这里写图片描述

    这里写图片描述

    自定义PopupWindow


    定义一个主类:

    package com.example.administrator.testpopuwindow;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        private PopWinShare popwindows;
        private TextView onclink_txt;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ways();
        }
    
        public void ways(){
            onclink_txt = (TextView) findViewById(R.id.onclink_txt);
            onclink_txt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                        popwindows = new PopWinShare(MainActivity.this);
                        popwindows.showPopupWindow(onclink_txt);
                }
            });
    
        }
    }
    

    主类布局xml代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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"
        android:clickable="true"
        android:orientation="vertical"
        tools:context="com.example.administrator.testpopuwindow.MainActivity"
        >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="right"
            android:background="#333333">
            <TextView
                android:id="@+id/onclink_txt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:layout_marginBottom="10dp"
                android:layout_marginRight="10dp"
                android:text="下拉菜单"
                android:textColor="#ffffff"
                android:textSize="18dp"/>
        </LinearLayout>
    
    </LinearLayout>
    

    自定义PopupWindow类,代码如下:

    package com.example.administrator.testpopuwindow;
    
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.drawable.ColorDrawable;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.LinearLayout;
    import android.widget.PopupWindow;
    import android.widget.Toast;
    
    /**
     * Created by Administrator on 2016-05-11.
     */
    
    public class PopWinShare extends PopupWindow {
    
        private View conentView;
        private Context context;
        public PopWinShare(final Activity context) {
    
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            conentView = inflater.inflate(R.layout.popwin_share, null);
            int h = context.getWindowManager().getDefaultDisplay().getHeight();
            int w = context.getWindowManager().getDefaultDisplay().getWidth();
            // 设置SelectPicPopupWindow的View
            this.setContentView(conentView);
            // 设置SelectPicPopupWindow弹出窗体的宽
            this.setWidth(w / 2 - 100);
            // 设置SelectPicPopupWindow弹出窗体的高
            this.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
            // 设置SelectPicPopupWindow弹出窗体可点击
            this.setFocusable(true);
            this.setOutsideTouchable(true);
            // 刷新状态
            this.update();
            // 实例化一个ColorDrawable颜色为半透明
            ColorDrawable dw = new ColorDrawable(0000000000);
            // 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作
            this.setBackgroundDrawable(dw);
            // mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
            // 设置SelectPicPopupWindow弹出窗体动画效果
            this.setAnimationStyle(R.style.AnimTools);
            LinearLayout addTaskLayout = (LinearLayout) conentView
                    .findViewById(R.id.add_task_layout);
            LinearLayout teamMemberLayout = (LinearLayout) conentView
                    .findViewById(R.id.team_member_layout);
            addTaskLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
    //                PopWinShare.this.dismiss();
                    Toast.makeText(context,"添加任务",Toast.LENGTH_LONG).show();
                }
            });
    
            teamMemberLayout.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
    //                PopWinShare.this.dismiss();
                    Toast.makeText(context,"团队管理",Toast.LENGTH_LONG).show();
                }
            });
        }
    
        /**
         * 显示popupWindow
         *
         * @param parent
         */
        public void showPopupWindow(View parent) {
    
            if (!this.isShowing()) {
                // 以下拉方式显示popupwindow
                this.showAsDropDown(parent, parent.getLayoutParams().width / 2, 18);
    
            } else {
                this.dismiss();
            }
        }
    
    }
    

    窗口布局xml,代码如下:

    <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="right"
            android:orientation="vertical" >
    
            <LinearLayout
                android:id="@+id/pop_layout2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="5dp"
                android:layout_alignParentTop="true"
                android:background="@mipmap/icon_msgbg2x"
                android:gravity="center_horizontal"
                android:orientation="vertical" >
    
                <LinearLayout
                    android:id="@+id/add_task_layout"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal"
                    android:layout_marginTop="15dp"
                    android:padding="8dp" >
    
                    <ImageView
                        android:layout_width="35dp"
                        android:layout_height="35dp"
                        android:scaleType="fitCenter"
                        android:src="@mipmap/ic_launcher" />
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="fill_parent"
                        android:layout_marginLeft="10dp"
                        android:gravity="center"
                        android:text="添加任务"
                        android:textColor="#ffffff"
                        android:textSize="15dip" />
                </LinearLayout>
    
                <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="0.2dp"
                    android:background="#000000" />
    
                <LinearLayout
                    android:id="@+id/team_member_layout"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal"
                    android:padding="8dp" >
    
                    <ImageView
                        android:layout_width="35dp"
                        android:layout_height="35dp"
                        android:scaleType="fitCenter"
                        android:src="@mipmap/ic_launcher" />
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="fill_parent"
                        android:layout_marginLeft="10dp"
                        android:gravity="center"
                        android:text="团队成员"
                        android:textColor="#ffffff"
                        android:textSize="15dip" />
                </LinearLayout>
    
                <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="0.2dp"
                    android:background="#000000" />
    
                <LinearLayout
    
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal"
                    android:padding="8dp" >
    
                    <ImageView
                        android:layout_width="35dp"
                        android:layout_height="35dp"
                        android:scaleType="fitCenter"
                        android:src="@mipmap/ic_launcher" />
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="fill_parent"
                        android:layout_marginLeft="10dp"
                        android:gravity="center"
                        android:text="任务管理"
                        android:textColor="#ffffff"
                        android:textSize="15dip" />
                </LinearLayout>
            </LinearLayout>
    
        </RelativeLayout>

    弹窗动画效果xml,anim/push_in.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <!-- 左上角扩大-->
    <scale   xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXScale="0.001"
        android:toXScale="1.0"
        android:fromYScale="0.001"
        android:toYScale="1.0"
        android:pivotX="90%"
        android:pivotY="0"
        android:duration="100" />

    弹窗动画效果xml,anim/push_out.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <!-- 左上角缩小 -->
    <scale   xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="0.001"
        android:fromYScale="1.0"
        android:toYScale="0.001"
        android:pivotX="90%"
        android:pivotY="0"
        android:duration="200" />

    style文件:

     <style name="AnimTools" parent="@android:style/Animation">
            <item name="android:windowEnterAnimation">@anim/push_in</item>
            <item name="android:windowExitAnimation">@anim/push_out</item>
        </style>

    ok,自定义下拉PopupWindow就完成了。


    这里写图片描述

    这里写图片描述

    展开全文
  • 先看效果图是否合口 在登录界面选择角色,上下箭头是会...使用的是RecycleView+自定义适配器+PopupWindow实现的: 1.准备好一个item_login_role.xml <?xml version="1.0" encoding="utf-8"?> <androi...

    先看效果图是否合口

    在登录界面选择角色,上下箭头是会变化的,默认是选择学生,当选择老师时,对应的icon、文字相应的改变(样式可以随意更改)。

    使用的是RecycleView+自定义适配器+PopupWindow实现的:

    1.准备好一个item_login_role.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/cl_item_loginRole_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="@dimen/spacing_5"
        android:background="@color/login_role_bg">
    
        <ImageView
            android:id="@+id/iv_item_loginRole"
            android:layout_width="@dimen/spacing_22"
            android:layout_height="@dimen/spacing_22"
            android:layout_marginLeft="@dimen/spacing_32"
            android:layout_marginTop="@dimen/spacing_12"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"/>
    
        <TextView
            android:id="@+id/tv_item_loginRole"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/spacing_9"
            android:textSize="@dimen/font_15"
            android:textColor="@color/text_black1"
            app:layout_constraintLeft_toRightOf="@id/iv_item_loginRole"
            app:layout_constraintTop_toTopOf="@+id/iv_item_loginRole"
            app:layout_constraintBottom_toBottomOf="@+id/iv_item_loginRole"/>
    
    </android.support.constraint.ConstraintLayout>

     2.自定义适配器LoginRoleAdapter

    /**
     * 登录角色选择时
     * Created by Administrator on 2019/11/19
     *
     * @author mcl
     */
    public class LoginRoleAdapter extends RecyclerView.Adapter {
        private Context mContext;
        private List<RoleBean> mList;
        private int selected = -1;
        private OnItemClickLitener mOnItemClickListener;
    
       public interface OnItemClickLitener {//点击事件回调
            void onItemClick(View view, int position);
        }
    
        public LoginRoleAdapter(Context context, List<RoleBean> list) {
            this.mContext = context;
            this.mList = list;
        }
    
        public void setmOnItemClickListener(OnItemClickLitener mOnItemClickListener) {
            this.mOnItemClickListener = mOnItemClickListener;
        }
    
        @NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_login_role, viewGroup, false);
            return new LoginRoleViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int i) {
           if (holder instanceof LoginRoleViewHolder){
               final  LoginRoleViewHolder viewHolder=(LoginRoleViewHolder)holder;
               viewHolder.tvRole.setText(mList.get(i).getRoleName());
               viewHolder.ivRole.setBackgroundResource(ResUtils.getId(mContext,mList.get(i).getRoleIcon(),ResUtils.MIPMAP));
               if (null!=mOnItemClickListener){
                   viewHolder.cl.setOnClickListener(new View.OnClickListener() {
                       @Override
                       public void onClick(View view) {
                           mOnItemClickListener.onItemClick(viewHolder.itemView,viewHolder.getAdapterPosition());
                       }
                   });
               }
           }
    
        }
    
        @Override
        public int getItemCount() {
            if (null != mList && mList.size() > 0) {
                return mList.size();
            } else {
                return 0;
            }
        }
    
        class LoginRoleViewHolder extends RecyclerView.ViewHolder {
            private ConstraintLayout cl;
            private ImageView ivRole;
            private TextView tvRole;
    
            public LoginRoleViewHolder(@NonNull View itemView) {
                super(itemView);
                cl = itemView.findViewById(R.id.cl_item_loginRole_view);
                ivRole = itemView.findViewById(R.id.iv_item_loginRole);
                tvRole = itemView.findViewById(R.id.tv_item_loginRole);
    
            }
        }
    }
    

    3.在activity里面:填充数据,及选择后回调,显示相应的文字、icon……

    private RecyclerView recyclerView;
    
      RoleBean role = new RoleBean();
            role.setRoleName(this.getString(R.string.module_app_login_login_teacher_role));
            role.setRoleIcon("login_teacher_btn");
            role.setUserrole("S03");
            roleList.add(role);
            RoleBean role1 = new RoleBean();
            role1.setRoleName(this.getString(R.string.module_app_login_login_parent_role));
            role1.setRoleIcon("login_parent_btn");
            role.setUserrole("S04");
            roleList.add(role1);
    
            LoginRoleAdapter adapter = new LoginRoleAdapter(this, roleList);
            recyclerView = new RecyclerView(this);
            recyclerView.setVerticalScrollBarEnabled(false);//隐藏滚动条
            recyclerView.setAdapter(adapter);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            adapter.setmOnItemClickListener(new LoginRoleAdapter.OnItemClickLitener() {
                @Override
                public void onItemClick(View view, int position) {
                    binding.tvLoginRole.setText(roleList.get(position).getRoleName());//设置选择的角色
                    binding.ivLoginRole.setBackgroundResource(ResUtils.getId(LoginActivity.this, roleList.get(position).getRoleIcon(), ResUtils.MIPMAP));  //设置选择角色对应的icon             
                    userrole=roleList.get(position).getUserrole();//获取选择的角色
                    window.dismiss();
                }
            });

     

     4.登录界面的布局这里就省略了(不要在布局里面放icon,不然会重叠,在对应代码里面放),点击时,创建PopupWindow

    项目用到的是dataBinding数据绑定,binding.ivLoginDirection指的是图标ImageView控件。

        /**
         * 选择角色点击事件
         *
         * @param view
         */
        public void clickRole(View view) {
            binding.ivLoginDirection.setBackgroundResource(ResUtils.getId(this, "login_arrow_up", ResUtils.MIPMAP));//向上的图标
            if (window == null) {
            //在binding.rlLoginRole控件下显示PopupWindow,一般长度就跟它一样,所以参数2是这么写的
                window = new PopupWindow(recyclerView, binding.rlLoginRole.getWidth(), RecyclerView.LayoutParams.WRAP_CONTENT);
            }
            window.setFocusable(true);//要让其中的view获取焦点,必须设置为true
            window.setOutsideTouchable(true);//设置点击外部消失
            window.showAsDropDown(binding.rlLoginRole, 0, 0);//binding.rlLoginRole要在哪个控件下显示
           window.setOnDismissListener(new PopupWindow.OnDismissListener() {//弹窗消失无论点击内外部,箭头都变成向下
                @Override
                public void onDismiss() {
                    binding.ivLoginDirection.setBackgroundResource(ResUtils.getId(LoginActivity.this, "login_arrow_down", ResUtils.MIPMAP));
                }
            });
        }

    5.补充RoleBean就三个属性,进行get、set方法即可,如下:

    /**
     * Created by Administrator on 2019/11/19
     *
     * @author mcl
     */
    public class RoleBean {
        private String roleIcon;
        private String roleName;
        private String userrole;
    
        public String getRoleIcon() {
            return roleIcon;
        }
    
        public void setRoleIcon(String roleIcon) {
            this.roleIcon = roleIcon;
        }
    
        public String getRoleName() {
            return roleName;
        }
    
        public void setRoleName(String roleName) {
            this.roleName = roleName;
        }
    
        public String getUserrole() {
            return userrole;
        }
    
        public void setUserrole(String userrole) {
            this.userrole = userrole;
        }
    }
    

     

    用了最笨的方法,虽然能满足需求,但是不够优化,有更好的方式,可以帮提点一下,感激不尽!

     

     

    展开全文
  • 安卓自定义下拉列表样式View demo 查看演示Download Source 下载源Hi guys! I’m back with another article just for you, and CSS related of course! This time, we are going to talk (and ...
  • 仿美团下拉筛选菜单,代码详细地址http://.ytsyt.cn/post/12.html
  • 自定义下拉框(android)

    千次下载 热门讨论 2013-03-26 20:51:41
    androoid自定义下拉框,仿WEB风格
  • android自定义下拉菜单,通过PopupWindow封装,可根据需要嵌入到工程。思路实现看文章 http://blog.csdn.net/garwen_yang/article/details/51252462
  • Android-自定义滑动菜单(抽屉效果),博客中有具体实现:http://blog.csdn.net/qxs965266509
  • 本文实例为大家分享了Android仿美团下拉菜单的实现代码,分类进行选择,供大家参考,具体内容如下 效果图 操作平台 AS2.0 第三方框架:butterknife build.gradle dependencies { compile fileTree(dir: 'libs', ...
  • 本文实例讲述了Android编程之ICS式下拉菜单PopupWindow实现方法。分享给大家供大家参考,具体如下: 运行效果截图如下: 右边这个就是下拉菜单啦,看见有的地方叫他 ICS式下拉菜单,哎哟,不错哦! 下面先讲一下...
  • 较简单的实现,有不足和实现的不到位的还请指教 属性动画处两种实现方式,注释中都有说明 ...学习和实现主要参考博客 http://blog.csdn.net/harvic880925?viewmode=contents 中自定义控件三部曲之动画篇的前面几篇
  • 本文实例讲述了Android编程实现自定义系统菜单背景的方法。分享给大家供大家参考,具体如下: 不多说,上图,见代码。 package lab.sodino.menutest; import android.content.Context; import android.app....
  • Android自定义下拉框,用PopupWindow实现
  • Android自定义下拉列表框控件

    万次阅读 2017-10-20 13:49:40
    Android中的有个原生的下拉列表控件Spinner,但是这个控件有时候不符合我们自己的要求, 比如有时候我们需要类似windows 或者web网页中常见的那种下拉列表控件,类似下图这样的: 这个时候只有自己动手...
  • 自定义功能强大的下拉筛选菜单flutter package,支持iOS和Android
  • android使用popupwindow自定义menu菜单

    热门讨论 2012-01-04 00:09:18
    android通过使用popupwindow控件实现自定义menu菜单
  • 本文较为详细的总结分析了Android编程下拉菜单spinner用法。分享给大家供大家参考,具体如下: Spinner控件也是一种列表类型的控件,它的继承关系如下: java.lang.Object  ↳ android.view.View  ↳ android....
  • Android 自定义下拉框的实现,效果可到http://www.cnblogs.com/awe061/p/5221145.html查看
  • android开发自定义下拉菜单

    千次阅读 2019-06-12 16:49:38
    import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Context; im.....
  • Android基础教程(九)之自定义下拉菜单模式----Spinner与setDropDownViewResource的应用
  • 主要介绍了Android自定义控件案例汇总,自定义开关、Listview实现下拉刷新、侧滑菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • // 这里是一个lineaLayout 相当于下拉菜单的那个框框了 View view = findViewById(R.id.ll); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 让...
  • android 自定义菜单Android 7.0 Nougat brings a lot of new features and refinements to the table, like the ability to customize Android’s Quick Settings panel with custom tile containing unique toggles...
  • 最近的项目中用到了类似美团中的下拉多选菜单,在实际开发过程中,也发现了一些问题,主要归纳如下:1.当菜单较为复杂时,如果不能设计好代码逻辑,将造成控件难于维护 2.美团菜单可以连续点击顶部tab,切换不同菜单...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,728
精华内容 4,291
关键字:

android自定义下拉菜单