关于AndroID的自定义控件,之前也写了两个,一个是简单地继承VIEw,另一个通过继承Layout实现一个省市联动控件。这篇,将通过继承VIEwGroup来实现一个电话拨打小键盘。本人一贯风格,懒得罗里吧嗦讲一大堆,直接上图上代码,一切尽在注释中!
1、MyPhoneCard.java
/** * * 自定义一个4*3的拨打电话的布局控件,* * */ public class MyPhoneCard extends VIEwGroup{ private static final int ColUMNS = 3; private static final int ROWS = 4; private static final int NUM_button = ColUMNS*ROWS; private VIEw[] mbuttons = new VIEw[NUM_button]; private int mbuttonWIDth; private int mbuttonHeight; private int mpaddingleft; private int mpaddingRight; private int mpaddingtop; private int mpaddingBottom; private int mWIDthInc; private int mHeightInc; private int mWIDth; private int mHeight; public MyPhoneCard(Context context) { super(context); } public MyPhoneCard(Context context,AttributeSet attrs){ super(context,attrs); } public MyPhoneCard(Context context,AttributeSet attrs,int defStyle){ super(context,attrs,defStyle); } /** * 当从xml将所有的控件都调入内存后,触发的动作 * 在这里获取控件的大小,并计算整个VIEwGroup需要的总的宽和高 */ @OverrIDe protected voID onFinishInflate(){ super.onFinishInflate(); final VIEw[] btns = mbuttons; for(int i=0; i<NUM_button; i++){ btns[i] = this.getChildAt(i); btns[i].measure(MeasureSpec.UnspecIFIED,MeasureSpec.UnspecIFIED); } //缓存大小 final VIEw child = btns[0]; mbuttonWIDth = child.getMeasureDWIDth(); mbuttonHeight = child.getMeasuredHeight(); mpaddingleft = this.getpaddingleft(); mpaddingRight = this.getpaddingRight(); mpaddingtop = this.getpaddingtop(); mpaddingBottom = this.getpaddingBottom(); mWIDthInc = mbuttonWIDth + mpaddingleft + mpaddingRight; mHeightInc = mbuttonHeight + mpaddingtop + mpaddingBottom; mWIDth = mWIDthInc*ColUMNS; mHeight = mHeightInc*ROWS; Log.v("Finish Inflate:","btnWIDth="+mbuttonWIDth+",btnHeight="+mbuttonHeight+",padding:"+mpaddingleft+","+mpaddingtop+","+mpaddingRight+","+mpaddingBottom); } /** * 这个方法在onFinishInflate之后,onLayout之前调用。这个方面调用两次 */ @OverrIDe protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec){ super.onMeasure(wIDthMeasureSpec,heightmeasureSpec); Log.v("VIEwGroup SIZE:wIDth=",mWIDth+""); Log.v("VIEwGroup SIZE: height=",mHeight+""); final int wIDth = resolveSize(mWIDth,wIDthMeasureSpec);//传入我们希望得到的宽度,得到测量后的宽度 final int height = resolveSize(mHeight,heightmeasureSpec);//传入我们希望得到的高度,得到测量后的高度 Log.v("VIEwGroup Measured SIZE: wIDth=",wIDth+""); Log.v("VIEwGroup Measured SIZE: height=",height+""); //重新计算后的结果,需要设置。下面这个方法必须调用 setMeasuredDimension(wIDth,height); } /** * 这个方法在onMeasure之后执行,这个自定义控件中含有12个子控件(每个小键),所以,重写这个方法, * 调用每个键的layout,将他们一个一个布局好 * 就是4*3的放置,很简单,一个嵌套循环搞定 */ @OverrIDe protected voID onLayout(boolean changed,int left,int top,int right,int bottom) { final VIEw[] buttons = mbuttons; int i = 0; Log.v("BottOM:",bottom+""); Log.v("top",top+""); int y = (bottom - top) - mHeight + mpaddingtop;//这里其实bottom-top=mHeight,所以y=mpaddingtop Log.v("Y=",y+""); for(int row=0; row<ROWS; row++){ int x = mpaddingleft; for(int col = 0; col < ColUMNS; coL++){ buttons[i].layout(x,y,x+mbuttonWIDth,y+mbuttonHeight); x = x + mWIDthInc; i++; } y = y + mHeightInc; } } }
2、布局文件:
<?xml version="1.0" enCoding="utf-8"?> <demo.phone.card.MyPhoneCard xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:ID = "@+ID/dialpad" androID:paddingleft="7dp" androID:paddingRight="7dp" androID:paddingtop="6dp" androID:paddingBottom="6dp" androID:layout_gravity="center" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:layout_marginBottom="5dp"> <Imagebutton androID:ID="@+ID/one" androID:src="@drawable/dial_num_1_no_vm" /> <Imagebutton androID:ID="@+ID/two" androID:src="@drawable/dial_num_2" /> <Imagebutton androID:ID="@+ID/three" androID:src="@drawable/dial_num_3" /> <Imagebutton androID:ID="@+ID/four" androID:src="@drawable/dial_num_4" /> <Imagebutton androID:ID="@+ID/five" androID:src="@drawable/dial_num_5" /> <Imagebutton androID:ID="@+ID/six" androID:src="@drawable/dial_num_6" /> <Imagebutton androID:ID="@+ID/seven" androID:src="@drawable/dial_num_7" /> <Imagebutton androID:ID="@+ID/eight" androID:src="@drawable/dial_num_8" /> <Imagebutton androID:ID="@+ID/nine" androID:src="@drawable/dial_num_9" /> <Imagebutton androID:ID="@+ID/star" androID:src="@drawable/dial_num_star" /> <Imagebutton androID:ID="@+ID/zero" androID:src="@drawable/dial_num_0" /> <Imagebutton androID:ID="@+ID/pound" androID:src="@drawable/dial_num_pound" /> </demo.phone.card.MyPhoneCard>
这样,就实现了上图的小键盘。这个例子参考AndroID自带电话应用的实现。可见,在开发中,灵活运用自定义的控件,可以实现独特而富有魅力的效果!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
您可能感兴趣的文章:解析android中隐藏与显示软键盘及不自动d出键盘的实现方法Android 显示和隐藏软键盘的方法(手动)Android 设置Edittext获取焦点并d出软键盘Android制作漂亮自适布局键盘的方法Android键盘显示与隐藏代码Android实现d出键盘的方法Android中监听软键盘显示状态实现代码Android 软键盘d出时把原来布局顶上去的解决方法Android键盘输入语言设置默认打开myanmar缅甸语的步骤Android软键盘遮挡的四种完美解决方案 总结以上是内存溢出为你收集整理的Android自定义控件之电话拨打小键盘全部内容,希望文章能够帮你解决Android自定义控件之电话拨打小键盘所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)