一 、写在正文前
作为一个初来乍到的非资深android从业者,这是本人第一次在掘金装逼,哦不,发表文章,因此有点小紧张以及难以掩饰的小激动[手动滑稽],若是有什么写的有问题的,没错,是本人技术问题,还望多多见谅。
二、概述
二话不说反手就是一个超链接:下载地址
一言不合反手又是一个超链接:github地址
本文将介绍的是一款在googleplay上线的APP:TextImageMaker
主要功能:将用户输入的文字制作成图片,让博主在朋友圈发表动态时不在因没有趁手的图而苦恼。
三、分析
前面已经提到app的初衷是满足博主在朋友圈日常发图的需求,因此功能上的核心就是如何将文字制作成图片,当然为了满足花式装逼,这里还要考虑的有,如何控制文字在图片中的显示位置,也就是align方式。那么问题来了,有哪些方案可行呢?
我能想到的大致为两个方案:
1. 自定义View,通过重写onDraw方法将获取的文字画出来
2. 自定义一个Drawable将文字画出来,再作为src设置到ImageView中
本文使用的就是第二种方式。
四、具体实现
到了这步其实问题已经很简单了,相信大部分看官已经能自己实现了,无非就是重写onDraw方法将传进来的文字画出来,嗯,的确如此,不过这里可能会遇到换行符无法被画出来的情况哟,好了,不瞎比比了,直接上代码:
@Override
public void draw(@NonNull Canvas canvas) {
switch (mAlign) {
case ALIGN_NORMAL:
break;
case ALIGN_OPPOSITE:
mContent = StringUtil.reverseString(mContent);
break;
case ALIGN_CENTER:
break;
}
// 文字回车换行
StaticLayout layout = new StaticLayout(mContent, mPaint, canvas.getWidth(), mAlign, 1.0F, 0.0F,true);
canvas.save();
int y = (canvas.getHeight() - layout.getHeight()) / 2;
canvas.translate(0, y);
float textWidth = mPaint.measureText(mContent);
layout.draw(canvas);
canvas.restore();
}复制代码
在获得了Drawable之后就可以直接在外面想要显示的地方通过ImageView#setImageDrawable将图片显示出来了。
到这里文字制作图片算是大功告成了,剩下的就是文字对齐的控制了。在码代码的时候博主当时就会心一笑so easy使用EditView的setGravity与getGravity不就轻轻松松对用户的动作做出了响应吗?然而现实很骨感。
当博主信誓旦旦的使用switch(EditView#getGravity)去判断当前的对齐方式时,获得的值一直是57...我的法克儿,这个问题,博主至今没搞明白,也试图通过源码去分析一波...还是有点没摸清就是了[生无可恋脸],所以这里我就不班门弄釜了(有知道的还请告知一二)
那么现在能做的就是绕过这个问题,曲线救国
博主想到的是,通过LinearLayout.LayoutParam mParam记录用户的操作,然后通过判断mParam的值,好了,废话不多说,直接上代码:
@Override
public void updateAlignPolicy() {
switch (mParams.gravity) {
case Gravity.CENTER:
mAlignPolicyIv.setImageResource(R.drawable.align_right);
mParams.gravity = Gravity.RIGHT;
mEdit.setGravity(Gravity.RIGHT);
break;
case Gravity.LEFT:
mAlignPolicyIv.setImageResource(R.drawable.align_center);
mParams.gravity = Gravity.CENTER;
mEdit.setGravity(Gravity.CENTER);
break;
case Gravity.RIGHT:
mAlignPolicyIv.setImageResource(R.drawable.align_left);
mParams.gravity = Gravity.LEFT;
mEdit.setGravity(Gravity.LEFT);
break;
}
}复制代码
@Override
public int getAlignPolicy() {
return mParams.gravity;
}复制代码
private Layout.Alignment verifyAlignment(int gravity) {
Layout.Alignment alignment;
switch (gravity) {
case Gravity.CENTER:
alignment = Layout.Alignment.ALIGN_CENTER;
break;
case Gravity.LEFT:
alignment = Layout.Alignment.ALIGN_NORMAL;
break;
case Gravity.RIGHT:
alignment = Layout.Alignment.ALIGN_OPPOSITE;
break;
default:
alignment = Layout.Alignment.ALIGN_CENTER;
break;
}
return alignment;
}复制代码
项目比较简单,因此适当加了些动画效果加强用户交互感,有兴趣的可以去github上看看源码,至于图片的本地保存和分享就不做赘述了。
五、结语
嘿,man,没错,说的就是你,鸡蛋别扔了。