Android自定义控件之电话拨打小键盘

关于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"
    style="@style/dial_btn_style"
    /> 

  <ImageButton android:id="@+id/two"
    android:src="@drawable/dial_num_2"
    style="@style/dial_btn_style"/>  

  <ImageButton android:id="@+id/three"
    android:src="@drawable/dial_num_3"
    style="@style/dial_btn_style"/>  

  <ImageButton android:id="@+id/four"
    android:src="@drawable/dial_num_4"
    style="@style/dial_btn_style"/>  

  <ImageButton android:id="@+id/five"
    android:src="@drawable/dial_num_5"
    style="@style/dial_btn_style"/> 

  <ImageButton android:id="@+id/six"
    android:src="@drawable/dial_num_6"
    style="@style/dial_btn_style"/>  

  <ImageButton android:id="@+id/seven"
    android:src="@drawable/dial_num_7"
    style="@style/dial_btn_style"/> 

  <ImageButton android:id="@+id/eight"
    android:src="@drawable/dial_num_8"
    style="@style/dial_btn_style"/> 

  <ImageButton android:id="@+id/nine"
    android:src="@drawable/dial_num_9"
    style="@style/dial_btn_style"/>  

  <ImageButton android:id="@+id/star"
    android:src="@drawable/dial_num_star"
    style="@style/dial_btn_style"/>   

  <ImageButton android:id="@+id/zero"
    android:src="@drawable/dial_num_0"
    style="@style/dial_btn_style"/>   

  <ImageButton android:id="@+id/pound"
    android:src="@drawable/dial_num_pound"
    style="@style/dial_btn_style"/>                                                    

</demo.phone.card.MyPhoneCard> 

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 解析android中隐藏与显示软键盘及不自动弹出键盘的实现方法
  • Android 显示和隐藏软键盘的方法(手动)
  • Android 设置Edittext获取焦点并弹出软键盘
  • Android制作漂亮自适布局键盘的方法
  • Android键盘显示与隐藏代码
  • Android实现弹出键盘的方法
  • Android中监听软键盘显示状态实现代码
  • Android 软键盘弹出时把原来布局顶上去的解决方法
  • Android键盘输入语言设置默认打开myanmar缅甸语的步骤
  • Android软键盘遮挡的四种完美解决方案
(0)

相关推荐

  • Android键盘输入语言设置默认打开myanmar缅甸语的步骤

    locale是通过系统设置的地区和latin输入法语言通过merger出来的,所以在系统地区设置和输入法语言中同时支持才可以在"输入语言设置"里设置 languageList是从存储latin输入法设置的latin_preferences.xml文件里读取出来的,上一次设置的输入语言 如果要设置某种语言在输入法默认打开可按一下步骤添加文件,我这里已经验证时OK的,你可以试一下. 提供简单的sample code,如默认将缅甸语.英文.法语输入法勾选: 1.书写文件LatinImeRec

  • Android中监听软键盘显示状态实现代码

    /**监听软键盘状态 * @param activity * @param listener */ public static void addOnSoftKeyBoardVisibleListener(Activity activity, final OnSoftKeyBoardVisibleListener listener) { final View decorView = activity.getWindow().getDecorView(); decorView.getViewTree

  • Android制作漂亮自适布局键盘的方法

    最近做了个自定义键盘,但面对不同分辨率的机型其中数字键盘不能根据界面大小自已铺满,但又不能每种机型都做一套吧,所以要做成自适应,那这里主讲思路. 这里最上面的titlebar高度固定,下面输入的金额高度也固定(当然也可以自适应),主要是中间的数字键盘,高度和宽度需要自适应.先来张效果图: 最常见的解决方案是用线性布局,自适应当然是按比例,但布局中无%的概念,那就要用到layout_weight了,该属性的作用是决定控件在其父布局中的显示权重(具体概念就不多说了). 这里用一个LinearLayo

  • Android实现弹出键盘的方法

    本文实例讲述了Android实现弹出键盘代码,是一个非常实用的功能.代码非常简洁.分享给大家供大家参考. 具体功能代码如下: Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { InputMethodManager m = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_

  • Android 显示和隐藏软键盘的方法(手动)

    在Android开发中,经常会有一个需求,做完某项操作后,隐藏键盘,也即让Android中的软键盘不显示.今天,和大家分享如何利用代码来实现对Android的软件盘的隐藏.显示的操作. 1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMeth

  • 解析android中隐藏与显示软键盘及不自动弹出键盘的实现方法

    1.//隐藏软键盘    ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 2.//显示软键盘,控件ID可以是EditText,TextView    ((InputMethodMa

  • Android 软键盘弹出时把原来布局顶上去的解决方法

    键盘弹出时,会将布局底部的导航条顶上去. 解决办法: 在mainfest.xml中,在和导航栏相关的activity中加: <activity android:name=".filing.MainActivity" android:windowSoftInputMode="adjustResize|stateHidden" /> windowSoftInputMode 属性解释: 活动的主窗口如何与包含屏幕上的软键盘窗口交互.这个属性的设置将会影响两件事

  • Android 设置Edittext获取焦点并弹出软键盘

    Android 设置Edittext获取焦点并弹出软键盘 /** * EditText获取焦点并显示软键盘 */ public static void showSoftInputFromWindow(Activity activity, EditText editText) { editText.setFocusable(true); editText.setFocusableInTouchMode(true); editText.requestFocus(); activity.getWind

  • Android软键盘遮挡的四种完美解决方案

    一.问题概述 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: 输入密码时输入框被系统键盘遮挡了,大大降低了用户操作体验,这就是开发中非常常见的软键盘遮挡的问题,该如何解决? 二.简单解决方案 方法一 在你的activity中的oncreate中setContentView之前写上这个代码 getWindow().setSoftInputMode(WindowManage

  • Android键盘显示与隐藏代码

    Java代码 复制代码 代码如下: InputMethodManager imm = (InputMethodManager)getSystemService(SendActivity.this.INPUT_METHOD_SERVICE); //显示键盘 imm.showSoftInput(editText, 0); //隐藏键盘 imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

随机推荐