Android学习笔记_点九绘图与软键盘和事件传递
最近项目里遇到的几个小问题,以前只是用吗没有深入看过,现在总结到一起,防止以后这种小问题占用太多时间。还是通过网上别人总结的很多博客学习了,挑选出最易懂明了的。
还有leader很小的问题都不放过,亲自track代码,每个小现象的流程都搞得很清楚,追求完美不马虎,怪不得技术这么好,大方向架构小方向细节,这两方面都很认真,值得我学习。
1. 关于切图中的.9图片:
这个跟上一篇差不多:关于”点九”
2. canvas绘图的:
下面会给出一个将bitmap截取为圆形图片的方法,背景黑色透明argb(0,0,0,0),无色。
/**
* 将图像处理为背景透明的圆形头像
* @param bitmap
* @return output
*/
public static Bitmap toRoundBitmap(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float roundPx;
float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;
if (width <= height) {
roundPx = width / 2;
top = 0;
bottom = width;
left = 0;
right = width;
height = width;
dst_left = 0;
dst_top = 0;
dst_right = width;
dst_bottom = width;
}
else {
roundPx = height / 2;
float clip = (width - height) / 2;
left = clip;
right = width - clip;
top = 0;
bottom = height;
width = height;
dst_left = 0;
dst_top = 0;
dst_right = height;
dst_bottom = height;
} Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output); final int color = 0xff424242;
final Paint paint = new Paint();
final Rect src = new Rect((int) left, (int) top, (int) right, (int) bottom);
final Rect dst = new Rect((int) dst_left, (int) dst_top, (int) dst_right, (int) dst_bottom);
final RectF rectF = new RectF(dst); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, src, dst, paint);
return output;
}
3. 焦点获取与软键盘:
起因:用了第三方Emoticon的输入法,用户发的帖子详情有评论功能,输入栏在屏幕底部,点击后会弹出键盘,笑脸是表情输入键盘和文字软键盘的切换。问题有两个:
Q1:点击某个跟帖进行评论时,焦点明明设置到评论输入栏了,键盘也出来了,可光标就是不在评论EditText上,能看到一闪而过的光标。
A1:因为表情隐藏在软键盘后,键盘显示的同时它的初始化会使里面的某个表情控件获取焦点,所以即使设置了评论输入栏的获取焦点事件,还是在键盘弹出时被后面Emoticon表情布局拿走了焦点。解决方法:延迟一定的时间再获取一次焦点,这个时间留给表情栏初始化,再次获取焦点就可以了。具体代码
/**
* <pre>
* 显示回复评论框
* </pre>
*/
private void showDiscuss() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mEmoticonsKeyBoard.changeEditTextFocus(true);
}
}, 500);
mEmoticonsKeyBoard.changeEditTextFocus(true);
// 显示键盘
EmoticonsUtils.openSoftKeyboard(mEmoticonsKeyBoard.getContentEdit());
}
测试是偶尔获取不到,跟时间设置有关,可以长一点是500ms。
Q2:键盘弹出时,点击返回键软键盘先消失,表情键盘还没消失,需要再点击一次才可以收起。当用第三方输入法则点击一次返回就可以,而系统输入法就不可以。
A2:第三方Emoticon的输入栏其实监听了KEYEVENT_BACK,但是没有被传递到这个事件。认为是系统键盘拦截了这个事件把自己隐藏了就没有向下传递导致的。非系统键盘比如搜狗,可能自己重写的这个部分所以没啥事。解决思路是:监听软键盘的收起,在某个监听函数里隐藏表情键盘。leader提示软键盘收起时会引起View的重绘,此时有个函数被触发,可以在这里做文章。百度:
关于系统软键盘弹出隐藏监听的讨论
这篇里提到的方法便是了,解决中...
事实上,表情输入法里有这个ResizeLayout,表情栏就是基于这个布局做的,仔细看了EmoticonsKeyBoardBar的代码,发现它继承自AutoHeightLayout,而AutoHeightLayout又继承自ResizeLayout。所以是带着OnResizeListener的接口的,只不过在EmoticonsKeyBoardBar中这个接口被包装成了KeyBoardBarViewListener,所以只要在这个监听接口中做文章就好了。棘手的是状态比较复杂。这个接口里有
public void OnKeyBoardStateChange(int state, int height);
state是EmoticonsKeyBoardBar用来记录表情键盘状态:
public static final int KEYBOARD_STATE_NONE = 100;// 键盘隐藏
public static final int KEYBOARD_STATE_FUNC = 102;// 表情栏显示,输入法软键盘消失
public static final int KEYBOARD_STATE_BOTH = 103;// 表情栏隐藏在后面,输入法软键盘出现
height表示表情键盘高度。这样要想在103的状态时点击返回达到双键盘隐藏的效果,必须要保证两个连续条件:条件1,当前是双键盘显示状态,条件2,接着点击返回键。此时点击后隐藏双键盘。除此之外其他都按原来的操作。用OnKeyBoardStateChange监听条件1,发生后state=103,height=540;监听条件2,发生后state=102,height=0;因此,这俩个按顺序发生就让键盘整个隐藏就好了。mEmoticonsKeyBoard.hideAutoView();其余情况不处理。
贴一下这个监听接口的代码
private boolean isHide = false;// 判断是否该隐藏全键盘
mEmoticonsKeyBoard.setOnKeyBoardBarViewListener(new EmoticonsKeyBoardBar.KeyBoardBarViewListener() {
@Override
public void OnKeyBoardStateChange(int state, int height) {
// step1:state = 103, height = 540>0 时,双键盘显示
if (state == 103 && height > 0) {
isHide = true;
}
// step2:双键盘显示时,点击返回键收起两个键盘
if(isHide && state == 102 && height == 0){
mEmoticonsKeyBoard.hideAutoView();
//isHide = false;
}
// 非上述两种前后组合时,均不做操作
if (!(state == 103 && height > 0)) {
isHide = false;
} } @Override
public void OnSendBtnClick(String msg) {
MobclickAgent.onEvent(MomentDetailActivity.this, "click_89");
mEmoticonsKeyBoard.resetFaceBtn();
// 隐藏键盘
mEmoticonsKeyBoard.hideAutoView();
clickCommentPublish(msg);
}
});
4. 上面键盘事件没有拦截到返回键点击,是跟android的事件传递机制有关的。学了这篇帖子之后,感觉:还是要好好看源码解决问题啊。
Android学习笔记_点九绘图与软键盘和事件传递的更多相关文章
- 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart
目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...
- 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge
目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...
- 【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView
目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只 ...
- Android学习笔记(十九)——内容提供器
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整 ...
- 【转】 Pro Android学习笔记(七九):服务(4):远程服务的实现
目录(?)[-] 远程服务的实现小例子 对外开放远程服务的接口 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flow ...
- 【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子
目录(?)[-] 小例子 Handler的处理 Activity的代码片段 后台线程和UI的互动 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://b ...
- 【转】 Pro Android学习笔记(五九):Preferences(3):EditText和Ringtone Preference
目录(?)[-] EditText Preferences xml文件 设备的存贮文件 Ringtone Preferences EditText Preferences xml文件 在res/xml ...
- 九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出
在<Effective Java 2nd Edition>中,第6条“消除过期的对象引用”提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象 ...
- 十五、Android学习笔记_授权过程
1.需要申请App Key和App Secret.不同的开发平台有不同的接入方式,可以参考文档,然后将这两个值放进去. 2.通过OAuth类实现认证,它会自动跳转到认证界面,进行授权,成功之后需要处理 ...
随机推荐
- php 验证身份证有效性,根据国家标准GB 11643-1999 15位和18位通用
//验证身份证是否有效 function validateIDCard($IDCard) { if (strlen($IDCard) == 18) { return check18IDCard($ID ...
- heap creation
There two methods to construct a heap from a unordered set of array. If a array has size n, it can b ...
- Ognl中根元素与非根元素的关系
Ognl中根元素与非根元素的关系 根元素:可以理解为全局变量 非根元素:局部变量 从两者获取其属性的方式看: Object obj = Ognl.parseExpression(“[1]”); [1] ...
- Conscription
Conscription Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total ...
- DOM注意事项(八):JavaScript操作环境和垃圾收集
一.运行环境 在约JavaScript对象或this当指向问题,念就是运行环境.即上下文环境.运行环境在JavaScript是一个非常重要的概念.由于它定义了变量或函数有权訪问的其他数据,决定了它们各 ...
- Mina入门:mina版之HelloWorld
一,前言: 在完成上篇文章<Mina入门:Java NIO框架Mina.Netty.Grizzly简介与对比>之后,我们现在可以正式切入Mina入门学习了. 二,搭建项目结构与解决项目依赖 ...
- Ubuntu自带的vi编辑器太难用了,换
由于Ubuntu预安装的是tiny版本,就会导致我们在使用上的产生不便.所以我们要安装vim的full版本. 首先,先卸掉旧版的vi,输入以下命令: sudo apt-get remove vim-c ...
- dubbo+zookeeper+spring+springMVC+mybatis的使用
读前声明:由于本人水平有限,有错误或者描述不恰当的地方请指出来,勿喷!第一次写博客. 源码下载链接:http://files.cnblogs.com/files/la-tiao-jun-blog/du ...
- poj3090--欧拉函数
#include<iostream> using namespace std; //欧拉函数 int eular(int n){ ,i; ;i*i<=n;i++){ ){ n/=i; ...
- 状态压缩DP------学习小记
状态DP主要用的还是DP思想,顾名思义,加了一个状态,主要是用来求状态个数的. 状态是用二进制数来表示的,也就是用0或1来表示,每一行有一个状态数,就是由这一行的0或1组成的,首先我们要获得每行的状态 ...