最近项目里遇到的几个小问题,以前只是用吗没有深入看过,现在总结到一起,防止以后这种小问题占用太多时间。还是通过网上别人总结的很多博客学习了,挑选出最易懂明了的。

还有leader很小的问题都不放过,亲自track代码,每个小现象的流程都搞得很清楚,追求完美不马虎,怪不得技术这么好,大方向架构小方向细节,这两方面都很认真,值得我学习。

1. 关于切图中的.9图片:

安卓android APP切图规范和.9png制作教程

这个跟上一篇差不多:关于”点九”

2. canvas绘图的:

PorterDuffXfermode的用法

setXfermode属性

下面会给出一个将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事件传递机制

Android学习笔记_点九绘图与软键盘和事件传递的更多相关文章

  1. 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart

    目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...

  2. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

  3. 【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView

    目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只 ...

  4. Android学习笔记(十九)——内容提供器

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整 ...

  5. 【转】 Pro Android学习笔记(七九):服务(4):远程服务的实现

    目录(?)[-] 远程服务的实现小例子 对外开放远程服务的接口 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flow ...

  6. 【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子

    目录(?)[-] 小例子 Handler的处理 Activity的代码片段 后台线程和UI的互动 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://b ...

  7. 【转】 Pro Android学习笔记(五九):Preferences(3):EditText和Ringtone Preference

    目录(?)[-] EditText Preferences xml文件 设备的存贮文件 Ringtone Preferences EditText Preferences xml文件 在res/xml ...

  8. 九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

    在<Effective Java 2nd Edition>中,第6条“消除过期的对象引用”提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象 ...

  9. 十五、Android学习笔记_授权过程

    1.需要申请App Key和App Secret.不同的开发平台有不同的接入方式,可以参考文档,然后将这两个值放进去. 2.通过OAuth类实现认证,它会自动跳转到认证界面,进行授权,成功之后需要处理 ...

随机推荐

  1. aix puppet agent

    demo控制脚本tel,150 5519 8367 Running Puppet on AIX Puppet on AIX is… not officially supported, yet stil ...

  2. Struts2 四、Struts2 处理流程

    1. 一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求: b) 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可 ...

  3. getBoundingClientRect()来获取页面元素的位置”

    getBoundingClientRect()来获取页面元素的位置” 获取的是一个对象; 延伸阅读; https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA== ...

  4. 复习day12-23

    获取请求中的内容: request.getParameter(); get方式因为在地址栏所以需要转码: String name = new String(req.getparameter().get ...

  5. C#反射概念以及实例详解【转】

    2009-08-28 13:12 佚名 互联网 我要评论(1) 字号:T | T C#反射概念以及实例向你介绍了C#反射的基本内容以及C#反射实例的简单应用,希望对你了解和学习C#反射以及C#反射实例 ...

  6. 集合与lamdba

    List<, , , , }; List<)); /* foreach (int k in iList2) { Console.WriteLine(k.ToString()); } * * ...

  7. C# 知识点记录(持续更新中)

    从看C#入门经典开始系统的学习C#,本文主要记录学习过程中的一些知识点,也是我博客生涯的开始,比较重要成体系的部分会单重新写文章整理归纳. 1.一字不变的字符串 @字符 使转义序列不被处理,按照原样输 ...

  8. JS精粹(二)

    这章主要讲语法,DC使用了表示形式语法的巴克斯范式图,这的确比语言来得准确简洁.我只想表达一个问题:表达式与表达式语句的关系.因为其他问题很明白. 从DC的巴科斯范式图上大致可以认为,表达式是比表达式 ...

  9. java -Xms -Xmx -XX:PermSize -XX:MaxPermSize

    java  -Xms -Xmx -XX:PermSize -XX:MaxPermSize     在做java开发时尤其是大型软件开发时经常会遇到内存溢出的问题,比如说OutOfMemoryError ...

  10. PHP正则提取HTML中img的url值

    <html> <head> <title>获取HTML中的img的src值</title> </head> <body> < ...