自定义Drawable:实现文字生成图片

一 、写在正文前

  作为一个初来乍到的非资深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,没错,说的就是你,鸡蛋别扔了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值