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

键盘布局:

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

<TableLayout xmlns:android="http://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>

显示效果如下:

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

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接口

pjsip视频通信开发(上层应用)之数字键盘的制作的更多相关文章

  1. pjsip视频通信开发(上层应用)之拨号键盘下部份拨号和删除功能

    我们开发的是视频电话,所以既可以视频通话,可以只有音频的通话,所以底部含有两个按钮,最后一个就是删除功能,如果输入错误,我们可以删除输入的内容. 这里我们要通过重写LinearLayout来实现这部份 ...

  2. pjsip视频通信开发(上层应用)之拨号界面整体界面功能实现

    在前面的几章里面写了显示.键盘.拨号.删除功能,这里我将他们进行组合,形成一个拨号键盘全部功能.首先是布局 <LinearLayout xmlns:android="http://sc ...

  3. pjsip视频通信开发(上层应用)之EditText重写

    我们经常使用手机的打电话功能,当我们按键盘的时候,有一个地方显示我们按键的内容,当我们的手点击那个地方的时候,并没有弹出软件盘,所以我们再有数字键盘的时候,要屏蔽系统的软件盘. 我们分析一下,软件盘弹 ...

  4. pjsip视频通信开发(底层实现)之用户注册(1)

    一.PJSIP简介 对于pjsip的介绍可以看http://www.cnblogs.com/my_life/articles/2175462.html 文章,里面详细介绍了它的组成框架以及各部份的组成 ...

  5. Android IOS WebRTC 音视频开发总结(七五)-- WebRTC视频通信中的错误恢复机制

    本文主要介绍WebRTC视频通信中的错误恢复机制(我们翻译和整理的,译者:jiangpeng),最早发表在[这里] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blac ...

  6. Web实现音频、视频通信

    Google开源实时通信项目WebRTC Google正式开源了WebRTC实时通信项目,希望浏览器厂商能够将该技术内建在浏览器中,从而使Web应用开发人员能够通过HTML标签和JavaScript ...

  7. 【转】基于V4L2的视频驱动开发

    编写基于V4L2视频驱动主要涉及到以下几个知识点:1> 摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法.各种参数的配置方法.信号输出类型等.2> Camera解码器.控制器 ...

  8. Android 串口蓝牙通信开发Java版本

    Android串口BLE蓝牙通信Java版 0. 导语 Qt on Android 蓝牙通信开发 我们都知道,在物联网中,BLE蓝牙是通信设备的关键设备.在传统的物联网应用中,无线WIFI.蓝牙和Zi ...

  9. 基于V4L2的视频驱动开发【转】

    转自:http://blog.chinaunix.net/uid-10747583-id-298573.html Tags:V4L2驱动框架.API.操作流程…… 原文地址:http://www.ee ...

随机推荐

  1. db file scattered read 等待事件

    db file scattered read 等待事件: 我们经常会见到db file scattered read  等待事件,在生产环境中,这个等待事件可能更为常见.这个事件表明用户进程正在读数据 ...

  2. mysql使用经验总结

    在工作中难免会遇到一些这个问题那个问题,当然在mysql中也不例外.今天就让我们来学学mysql中一些比较常用的东西  . 1.有时我们想去查某张表中的字段,但是表中的数据多,字段也很多,如果用sel ...

  3. tcprstat源码分析之tcp数据包分析

    tcprstat是percona用来监测mysql响应时间的.不过对于任何运行在TCP协议上的响应时间,都可以用.本文主要做源码分析,如何使用tcprstat请大家查看博文<tcprstat分析 ...

  4. ashx-auth-黑色简洁验证码

    ylbtech-util: ashx-auth-黑色简洁验证码 ashx-auth-黑色简洁验证码 1.A,效果图返回顶部   1.B,源代码返回顶部 /ImageUniqueCode.ashx &l ...

  5. DevExpress控件使用小结 z

    .TextEditor(barEditItem)取文本 string editValue = barEditItem1.EditValue.ToString(); //错误,返回null string ...

  6. <译>Selenium Python Bindings 1 - Installation

    Installation Introduction Selenium Python bindings 提供了一个简单的API来使用Selenium WebDriver编写使用功能/验收测试.通过Sel ...

  7. Linux Systemd——在RHEL/CentOS 7中启动/停止/重启服务

    RHEL/CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理.systemd兼容SysV和Li ...

  8. css样式表中的样式覆盖顺序

    刚才写zenktodo的时候,通过动态添加class的方式修改一个div的样式,总是不起作用. #navigator { height: 100%; width: 200; position: abs ...

  9. mybatis系列-10-一对一查询

    10.1     需求 查询订单信息,关联查询创建订单的用户信息 10.2     resultType 10.2.1      sql语句 确定查询的主表:订单表 确定查询的关联表:用户表 关联查询 ...

  10. 【转】VC6.0附带小工具软件一览

    )ActiveX Control Test Container称为"ActiveX 控件测试容器",顾名思义,此工具的主要功能就是测试ActiveX 控件,可以通过改变Active ...