Android自定义控件之电话拨打小键盘,android 自适应控件

6
回复
562
查看
[复制链接]

475

主题

1109

帖子

5795

安币

手工艺人

发表于 2018-5-21 11:36:48 | 显示全部楼层 |阅读模式

            

        关于android的自定义控件,之前也写了两个,一个是简单地继承view,另一个通过继承layout实现一个省市联动控件。这篇,将通过继承viewgroup来实现一个电话拨打小键盘。本人一贯风格,懒得罗里吧嗦讲一大堆,直接上图上代码,一切尽在注释中!

        

        1、myphonecard.java

[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、布局文件:

[Java] 查看源文件 复制代码
<

        这样,就实现了上图的小键盘。这个例子参考android自带电话应用的实现。可见,在开发中,灵活运用自定义的控件,可以实现独特而富有魅力的效果!






        

426

主题

1064

帖子

1935

安币

手工艺人

发表于 2018-5-21 16:30:42 | 显示全部楼层
不错不错,楼主辛苦了。。。

62

主题

9758

帖子

912

安币

代码手工艺人

学海无涯

Rank: 4

QQ达人

发表于 2018-5-21 23:54:22 | 显示全部楼层
安卓巴士是个不错的网站,我来顶个贴~

7

主题

9564

帖子

1970

安币

Android大神

Rank: 6Rank: 6

发表于 2018-5-22 06:34:06 | 显示全部楼层
楼主是好人,回个帖会有安币吗?

501

主题

1163

帖子

317

安币

手工艺人

发表于 2018-5-22 12:04:54 | 显示全部楼层
支持楼主,支持安卓巴士!

8

主题

9273

帖子

3549

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 2018-5-22 18:23:31 | 显示全部楼层
每次我都积极回帖的,想要安币~

317

主题

920

帖子

698

安币

手工艺人

发表于 2018-5-22 23:27:47 | 显示全部楼层
楼主威武,以后多发干货,多办活动~!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们
领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )