【Android开发:自定义控件系列一】仿android4.0 Spinner下拉效果
来源:互联网 发布:做网络推广压力大吗 编辑:程序博客网 时间:2024/05/01 04:12
【Android开发:自定义控件系列一】仿android4.0 Spinner下拉效果
1.自定义控件需求
自从android4.0发布后,android的桌面效果进一步得到增强以及美化,增加了动画特效,可是这仅仅用于android4.0以上的版本,
对于很多停留在android2.3或者更低的版本时,很多只有感叹。
为了获得更好的用户体验,很多软件产品在设计时,已经考虑到在android4.0以下版本加入android4.0以上版本的特效,那么
自定义控件来达到效果。
2.效果展示
3.技术点
1.自定义控件spinner包含Button和PopupWindow控件;
2.当点击Button时,展示PopupWindow控件;
3.点击PopupWindow的布局控件时,隐藏,并设置Button;
4.代码展示
1.主界面
1 public class MainActivity extends Activity { 2 3 private SpinnerButton mSpinnerBtn; 4 5 @Override 6 public void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.main); 9 10 this.mSpinnerBtn = (SpinnerButton) this11 .findViewById(R.id.spinner_btn);12 13 // 设置下拉布局资源文件,布局创建监听器,以便实例化控件对象14 mSpinnerBtn.setResIdAndViewCreatedListener(R.layout.spinner_dropdown_items,15 new SpinnerButton.ViewCreatedListener(){16 @Override17 public void onViewCreated(View v) {18 19 // TODO Auto-generated method stub20 v.findViewById(R.id.textView1).setOnClickListener(new View.OnClickListener() {21 @Override22 public void onClick(View v) {23 // TODO Auto-generated method stub24 handleClick(((TextView)v).getText().toString());25 }26 });27 v.findViewById(R.id.textView2).setOnClickListener(new View.OnClickListener() {28 @Override29 public void onClick(View v) {30 // TODO Auto-generated method stub31 handleClick(((TextView)v).getText().toString());32 }33 });34 v.findViewById(R.id.textView3).setOnClickListener(new View.OnClickListener() {35 @Override36 public void onClick(View v) {37 // TODO Auto-generated method stub38 handleClick(((TextView)v).getText().toString());39 }40 });41 v.findViewById(R.id.textView4).setOnClickListener(new View.OnClickListener() {42 @Override43 public void onClick(View v) {44 // TODO Auto-generated method stub45 handleClick(((TextView)v).getText().toString());46 }47 });48 }49 50 });51 }52 53 private void handleClick(String text){54 mSpinnerBtn.dismiss();55 mSpinnerBtn.setText(text);56 }57 }
2.自定义控件Spinner
1 /** 2 * @ClassName SpinnerButton 3 * @Description TODO 防android4.0 Spinner下拉效果 4 * @author kenny 5 * @date 2012-8-14 6 */ 7 public class SpinnerButton extends Button { 8 9 private Context mContext; 10 /** 下拉PopupWindow */ 11 private UMSpinnerDropDownItems mPopupWindow; 12 /** 下拉布局文件ResourceId */ 13 private int mResId; 14 /** 下拉布局文件创建监听器 */ 15 private ViewCreatedListener mViewCreatedListener; 16 17 public SpinnerButton(Context context, AttributeSet attrs, int defStyle) { 18 super(context, attrs, defStyle); 19 initButton(context); 20 } 21 22 public SpinnerButton(Context context, AttributeSet attrs) { 23 super(context, attrs); 24 initButton(context); 25 } 26 public SpinnerButton(Context context, final int resourceId, 27 ViewCreatedListener mViewCreatedListener) { 28 super(context); 29 setResIdAndViewCreatedListener(resourceId, mViewCreatedListener); 30 initButton(context); 31 } 32 33 private void initButton(Context context) { 34 this.mContext = context; 35 // UMSpinnerButton监听事件 36 setOnClickListener(new UMSpinnerButtonOnClickListener()); 37 } 38 39 public PopupWindow getPopupWindow() { 40 return mPopupWindow; 41 } 42 43 public void setPopupWindow(UMSpinnerDropDownItems mPopupWindow) { 44 this.mPopupWindow = mPopupWindow; 45 } 46 47 public int getResId() { 48 return mResId; 49 } 50 /** 51 * @Description: TODO 隐藏下拉布局 52 */ 53 public void dismiss(){ 54 mPopupWindow.dismiss(); 55 } 56 /** 57 * @Description: TODO 设置下拉布局文件,及布局文件创建监听器 58 * @param @param mResId 下拉布局文件ID 59 * @param @param mViewCreatedListener 布局文件创建监听器 60 */ 61 public void setResIdAndViewCreatedListener(int mResId, ViewCreatedListener mViewCreatedListener) { 62 this.mViewCreatedListener = mViewCreatedListener; 63 // 下拉布局文件id 64 this.mResId = mResId; 65 // 初始化PopupWindow 66 mPopupWindow = new UMSpinnerDropDownItems(mContext); 67 } 68 69 /** 70 * UMSpinnerButton的点击事件 71 */ 72 class UMSpinnerButtonOnClickListener implements View.OnClickListener { 73 74 @Override 75 public void onClick(View v) { 76 if (mPopupWindow != null) { 77 if (!mPopupWindow.isShowing()) { 78 // 设置PopupWindow弹出,退出样式 79 mPopupWindow.setAnimationStyle(R.style.Animation_dropdown); 80 // 计算popupWindow下拉x轴的位置 81 int lx = (SpinnerButton.this.getWidth() 82 - mPopupWindow.getmViewWidth() - 7) / 2; 83 // showPopupWindow 84 mPopupWindow.showAsDropDown(SpinnerButton.this, lx, -5); 85 } 86 } 87 } 88 } 89 90 /** 91 * @ClassName UMSpinnerDropDownItems 92 * @Description TODO 下拉界面 93 * @author kenny 94 * @date 2012-8-14 95 */ 96 public class UMSpinnerDropDownItems extends PopupWindow { 97 98 private Context mContext; 99 /** 下拉视图的宽度 */100 private int mViewWidth;101 /** 下拉视图的高度 */102 private int mViewHeight;103 104 public UMSpinnerDropDownItems(Context context) {105 super(context);106 this.mContext = context;107 loadViews();108 }109 110 /**111 * @Description: TODO 加载布局文件112 * @param113 * @return void114 * @throws115 */116 private void loadViews() {117 // 布局加载器加载布局文件118 LayoutInflater inflater = LayoutInflater.from(mContext);119 final View v = inflater.inflate(mResId, null);120 // 计算view宽高121 onMeasured(v);122 123 // 必须设置124 setWidth(LayoutParams.WRAP_CONTENT);125 setHeight(LayoutParams.WRAP_CONTENT);126 setContentView(v);127 setFocusable(true);128 129 // 设置布局创建监听器,以便在实例化布局控件对象130 if (mViewCreatedListener != null) {131 mViewCreatedListener.onViewCreated(v);132 }133 }134 135 /**136 * @Description: TODO 计算View长宽137 * @param @param v138 */139 private void onMeasured(View v) {140 int w = View.MeasureSpec.makeMeasureSpec(0,141 View.MeasureSpec.UNSPECIFIED);142 int h = View.MeasureSpec.makeMeasureSpec(0,143 View.MeasureSpec.UNSPECIFIED);144 v.measure(w, h);145 mViewWidth = v.getMeasuredWidth();146 mViewHeight = v.getMeasuredHeight();147 }148 149 public int getmViewWidth() {150 return mViewWidth;151 }152 153 public void setmViewWidth(int mViewWidth) {154 this.mViewWidth = mViewWidth;155 }156 157 public int getmViewHeight() {158 return mViewHeight;159 }160 161 public void setmViewHeight(int mViewHeight) {162 this.mViewHeight = mViewHeight;163 }164 165 }166 /**167 * @ClassName ViewCreatedListener 168 * @Description TODO 布局创建监听器,实例化布局控件对象169 * @author kenny 170 * @date 2012-8-15171 */172 public interface ViewCreatedListener {173 void onViewCreated(View v);174 }175 }
注意:在public UMSpinnerDropDownItems(Context context)构造函数里,不能继承super(context);否则会出现下拉框黑边的情况;
由于时间关系,其他代码就不一一贴出来了,要的话直接去下载工程 源代码下载
0 0
- 【Android开发:自定义控件系列一】仿android4.0 Spinner下拉效果
- 【Android开发:自定义控件系列一】仿android4.0 Spinner下拉效果
- 【Android开发:自定义控件系列一】仿android4.0 Spinner下拉效果
- 仿android4.0 Spinner下拉效果
- Android 下拉控件:Spinner
- 仿Ios下拉菜单,android Spinner效果(美团下拉效果)
- 仿QQ下拉菜单列表 自定义Spinner
- 自定义控件之------仿ios下拉回弹效果
- Android自定义控件--仿 path 效果 ArcMenu
- Android学习笔记(一) 下拉列表Spinner控件
- android--Spinner(菜单下拉控件)
- Android 下拉列表Spinner控件
- android 控件 下拉列表(Spinner)
- Android下拉菜单Spinner控件
- android----Spinner下拉列表控件
- android:自定义spinner下拉框
- android Spinner自定义下拉框
- Android自定义ListView实现下拉刷新,效果仿SwipeRefreshLayout
- WAPPUSH 原理 基于短信网关WAP推送的实现
- SQL server 数据库 如何把一张表复制到另一个数据库表中
- svn的使用
- ios json对象转为对象数组
- 为了保证Linux系统正常运行、准确解决遇到的各种各样的系统问题
- 【Android开发:自定义控件系列一】仿android4.0 Spinner下拉效果
- JDK1.5新特性探讨
- 栈(3)--栈与递归
- Aspose for Cloud如何在PHP中执行邮件合并
- MFC中Listbox控件的使用
- 开元研究:产品入市调查方案——了解产品消费者的需求
- 报表查询之存储过程细节要点
- Create WAP Push SMS Messages By Adam Bird
- SQL SERVER的优化方法与建议初级培训