您现在的位置:首页 >> 前端 >> 内容

pjsip视频通信开发(上层应用)之数字键盘的制作

时间:2013/10/29 15:32:02 点击:

  核心提示:在pjsip视频通信开发(上层应用)之EditText重写中我制作了一个显示输入内容的EditText,这里将制作一个数字键盘,其实跟计算器一样,最多的就是用TableLayout来实现,内部通过权重...
在pjsip视频通信开发(上层应用)之EditText重写中我制作了一个显示输入内容的EditText,这里将制作一个数字键盘,其实跟计算器一样,最多的就是用TableLayout来实现,内部通过权重(weight)来实现布局的统一,上层实现按键事件触发回调实现内容的输出。

键盘布局:

[html] 

<?xml version="1.0" encoding="utf-8"?>  

  

<TableLayout xmlns:android="https://schemas.android.com/apk/res/android"  

    android:layout_width="match_parent"  

    android:layout_height="match_parent" >  

  

    <TableRow  

        android:layout_width="match_parent"  

        android:layout_height="wrap_content"  

        android:layout_weight="1" >  

  

        <ImageButton  

            android:id="@+id/button1"  

            style="@style/DialtactsDialpadButtonStyle"  

            android:contentDescription="@string/description_image_button_one"  

            android:src="@drawable/dial_num_1" />  

  

        <ImageButton  

            android:id="@+id/button2"  

            style="@style/DialtactsDialpadButtonStyle"  

            android:contentDescription="@string/description_image_button_two"  

            android:src="@drawable/dial_num_2" />  

  

        <ImageButton  

            android:id="@+id/button3"  

            style="@style/DialtactsDialpadButtonStyle"  

            android:contentDescription="@string/description_image_button_three"  

            android:src="@drawable/dial_num_3" />  

    </TableRow>  

  

    <TableRow  

        android:layout_width="match_parent"  

        android:layout_height="wrap_content"  

        android:layout_weight="1" >  

  

        <ImageButton  

            android:id="@+id/button4"  

            style="@style/DialtactsDialpadButtonStyle"  

            android:contentDescription="@string/description_image_button_four"  

            android:src="@drawable/dial_num_4" />  

  

        <ImageButton  

            android:id="@+id/button5"  

            style="@style/DialtactsDialpadButtonStyle"  

            android:contentDescription="@string/description_image_button_five"  

            android:src="@drawable/dial_num_5" />  

  

        <ImageButton  

            android:id="@+id/button6"  

            style="@style/DialtactsDialpadButtonStyle"  

            android:contentDescription="@string/description_image_button_six"  

            android:src="@drawable/dial_num_6" />  

    </TableRow>  

  

    <TableRow  

        android:layout_width="match_parent"  

        android:layout_height="wrap_content"  

        android:layout_weight="1" >  

  

        <ImageButton  

            android:id="@+id/button7"  

            style="@style/DialtactsDialpadButtonStyle"  

            android:contentDescription="@string/description_image_button_seven"  

            android:src="@drawable/dial_num_7" />  

  

        <ImageButton  

            android:id="@+id/button8"  

            style="@style/DialtactsDialpadButtonStyle"  

            android:contentDescription="@string/description_image_button_eight"  

            android:src="@drawable/dial_num_8" />  

  

        <ImageButton  

            android:id="@+id/button9"  

            style="@style/DialtactsDialpadButtonStyle"  

            android:contentDescription="@string/description_image_button_nine"  

            android:src="@drawable/dial_num_9" />  

    </TableRow>  

  

    <TableRow  

        android:layout_width="match_parent"  

        android:layout_height="wrap_content"  

        android:layout_weight="1" >  

  

        <ImageButton  

            android:id="@+id/buttonstar"  

            style="@style/DialtactsDialpadButtonStyle"  

            android:contentDescription="@string/description_image_button_star"  

            android:src="@drawable/dial_num_star" />  

  

        <ImageButton  

            android:id="@+id/button0"  

            style="@style/DialtactsDialpadButtonStyle"  

            android:contentDescription="@string/description_image_button_zero"  

            android:src="@drawable/dial_num_0" />  

  

        <ImageButton  

            android:id="@+id/buttonpound"  

            style="@style/DialtactsDialpadButtonStyle"  

            android:contentDescription="@string/description_image_button_pound"  

            android:src="@drawable/dial_num_pound" />  

    </TableRow>  

  

</TableLayout>  

 

显示效果如下:

pjsip视频通信开发(上层应用)之数字键盘的制作

布局设置好之后,我们就要调用布局,设置监听实现回调。

[java]  

package com.jwzhangjie.pjsip.widgets;  

  

import java.util.HashMap;  

import java.util.Map;  

  

import com.jwzhangjie.pjsip.R;  

  

import android.annotation.SuppressLint;  

import android.content.Context;  

import android.media.ToneGenerator;  

import android.util.AttributeSet;  

import android.util.SparseArray;  

import android.view.View;  

import android.view.View.OnClickListener;  

import android.view.KeyEvent;  

import android.view.LayoutInflater;  

import android.widget.FrameLayout;  

import android.widget.ImageButton;  

  

public class Dialpad extends FrameLayout implements OnClickListener {  

  

    private OnDialKeyListener onDialKeyListener;  

  

    public Dialpad(Context context) {  

        super(context);  

        initLayout(context);  

    }  

  

    public Dialpad(Context context, AttributeSet attrs) {  

        super(context, attrs);  

        initLayout(context);  

    }  

  

    private void initLayout(Context context) {  

        LayoutInflater inflater = LayoutInflater.from(context);  

        inflater.inflate(R.layout.dialpad, this, true);  

    }  

  

//   Here we need a map to quickly find if the clicked button id is in the map  

//   keys,之所以这里不用SparseArrays,因为下面取值的方便  

    @SuppressLint("UseSparseArrays")  

    private static final Map<Integer, int[]> DIGITS_BTNS = new HashMap<Integer, int[]>();  

    static {  

        DIGITS_BTNS.put(R.id.button0, new int[] { ToneGenerator.TONE_DTMF_0,  

                KeyEvent.KEYCODE_0 });  

        DIGITS_BTNS.put(R.id.button1, new int[] { ToneGenerator.TONE_DTMF_1,  

                KeyEvent.KEYCODE_1 });  

        DIGITS_BTNS.put(R.id.button2, new int[] { ToneGenerator.TONE_DTMF_2,  

                KeyEvent.KEYCODE_2 });  

        DIGITS_BTNS.put(R.id.button3, new int[] { ToneGenerator.TONE_DTMF_3,  

                KeyEvent.KEYCODE_3 });  

        DIGITS_BTNS.put(R.id.button4, new int[] { ToneGenerator.TONE_DTMF_4,  

                KeyEvent.KEYCODE_4 });  

        DIGITS_BTNS.put(R.id.button5, new int[] { ToneGenerator.TONE_DTMF_5,  

                KeyEvent.KEYCODE_5 });  

        DIGITS_BTNS.put(R.id.button6, new int[] { ToneGenerator.TONE_DTMF_6,  

                KeyEvent.KEYCODE_6 });  

        DIGITS_BTNS.put(R.id.button7, new int[] { ToneGenerator.TONE_DTMF_7,  

                KeyEvent.KEYCODE_7 });  

        DIGITS_BTNS.put(R.id.button8, new int[] { ToneGenerator.TONE_DTMF_8,  

                KeyEvent.KEYCODE_8 });  

        DIGITS_BTNS.put(R.id.button9, new int[] { ToneGenerator.TONE_DTMF_9,  

                KeyEvent.KEYCODE_9 });  

        DIGITS_BTNS.put(R.id.buttonpound, new int[] {  

                ToneGenerator.TONE_DTMF_P, KeyEvent.KEYCODE_POUND });  

        DIGITS_BTNS.put(R.id.buttonstar, new int[] { ToneGenerator.TONE_DTMF_S,  

                KeyEvent.KEYCODE_STAR });  

    };  

  

    /** 

     * SparseArray这个是android提供的,可以替换HashMap,来提高效率 

     */  

    private static final SparseArray<String> DIGITS_NAMES = new SparseArray<String>();  

  

    static {  

        DIGITS_NAMES.put(R.id.button0, "0");  

        DIGITS_NAMES.put(R.id.button1, "1");  

        DIGITS_NAMES.put(R.id.button2, "2");  

        DIGITS_NAMES.put(R.id.button3, "3");  

        DIGITS_NAMES.put(R.id.button4, "4");  

        DIGITS_NAMES.put(R.id.button5, "5");  

        DIGITS_NAMES.put(R.id.button6, "6");  

        DIGITS_NAMES.put(R.id.button7, "7");  

        DIGITS_NAMES.put(R.id.button8, "8");  

        DIGITS_NAMES.put(R.id.button9, "9");  

        DIGITS_NAMES.put(R.id.buttonpound, "pound");  

        DIGITS_NAMES.put(R.id.buttonstar, "star");  

    };  

  

    public interface OnDialKeyListener {  

  

        /** 

         * Called when the user make an action 

         *  

         * @param keyCode 

         *            keyCode pressed 

         * @param dialTone 

         *            corresponding dialtone 

         */  

        void onTrigger(int keyCode, int dialTone);  

    }  

  

    @Override  

    protected void onFinishInflate() {  

        super.onFinishInflate();  

  

        for (int buttonId : DIGITS_BTNS.keySet()) {  

            ImageButton button = (ImageButton) findViewById(buttonId);  

            if (button != null) {  

                button.setOnClickListener(this);  

            }  

        }  

    }  

  

    /** 

     * Registers a callback to be invoked when the user triggers an event. 

     *  

     * @param listener 

     *            the OnTriggerListener to attach to this view 

     */  

    public void setOnDialKeyListener(OnDialKeyListener listener) {  

        onDialKeyListener = listener;  

    }  

  

    private void dispatchDialKeyEvent(int buttonId) {  

        if (onDialKeyListener != null && DIGITS_BTNS.containsKey(buttonId)) {  

            int[] datas = DIGITS_BTNS.get(buttonId);  

            onDialKeyListener.onTrigger(datas[1], datas[0]);  

        }  

    }  

  

    @Override  

    public void onClick(View v) {  

        dispatchDialKeyEvent(v.getId());  

    }  

}  

 

 

我们看看上面的代码:

1、initLayout来解析布局之后

2、onFinishInflate来设置按钮的点击事件

3、onClick处理点击事件,通过dispatchDialKeyEvent来实现分发事件

4、dispatchDialKeyEvent来根据不同的id,来设置回调onDialKeyListener.onTrigger,所以在实现Dialpad后,要实现OnDialKeyListener接口

Tags:PJ JS SI IP 
作者:网络 来源:不详