开发者社区> 乾初> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

利用TextView中的DrawableTop实现图片在文字上方,点击TextView能实现图片旋转

简介: 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 在今日头条里面Home按钮点击时候,能出现旋转的动画。这里模仿今日头条的Home按钮效果,通过自定义View来实现该效果。
+关注继续查看

终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~

在今日头条里面Home按钮点击时候,能出现旋转的动画。这里模仿今日头条的Home按钮效果,通过自定义View来实现该效果。

先给出工程代码的GitHub地址:TopTextView

其实主要是在onDraw里面先绘制图片,然后再绘制text。旋转的动画通过animation-rotate实现。具体代码如下:

    @Override
    protected void onDraw(Canvas canvas) {

        if (mDrawableTop == null) {
            super.onDraw(canvas);
            return;
        }
        int drawablePadding = getCompoundDrawablePadding();
        int drawableWidth = this.mDrawableTop.getIntrinsicWidth();
        int drawableHeight = this.mDrawableTop.getIntrinsicHeight();
//        startDrawableX = (getWidth() >> 1) - ((drawablePadding + textWidth + drawableWidth) >> 1);
//        startDrawableY = (getHeight() >> 1) - (drawableHeight >> 1);
        startDrawableX = (getWidth()>>1) - (drawableWidth>>1);
        startDrawableY = (getHeight()>>1) - ((drawableHeight+textHeight+drawablePadding)>>1);
        //画旋转图片
        canvas.save();
        canvas.translate(startDrawableX, startDrawableY);
        this.mDrawableTop.draw(canvas);
        canvas.restore();

        //画文字
//        int boxht = this.getMeasuredHeight() - this.getExtendedPaddingTop() - this.getExtendedPaddingBottom();
//        int textht = getLayout().getHeight();
//        int  voffsetText = boxht - textht >> 1;
//        int boxht = this
        canvas.save();
//        canvas.translate((float) (startDrawableX + drawableWidth + drawablePadding), (float) (getExtendedPaddingTop() + voffsetText));
        canvas.translate((float)(getExtendedPaddingBottom()),(float)(startDrawableY+drawableHeight+drawablePadding));
        getLayout().draw(canvas);
        canvas.restore();
    }

为了实现重复绘制,需要重写下面函数:

 @Override
    public void invalidateDrawable(Drawable drawable) {
//        super.invalidateDrawable(drawable);
        final Rect dirty = drawable.getBounds();
        int scrollX = 0;
        int scrollY = 0;
        if(drawable == this.mDrawableTop){
            scrollX = startDrawableX;
            scrollY = startDrawableY;
        }
        this.invalidate(dirty.left + scrollX-2, dirty.top + scrollY-2, dirty.right + scrollX+2, dirty.bottom + scrollY+2);
    }

具体代码可以参考工程里面代码。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JavaWeb-Servlet技术的监听器-解析与实例-网站在线用户信息与网页点击量(2)
JavaWeb-Servlet技术的监听器-解析与实例-网站在线用户信息与网页点击量
22 0
RVB2601 基于 W800 接入生活物联网平台(飞燕平台)
本文介绍如何基于已有的 RVB2601 工程实现飞燕平台的接入。
410 0
x64_dbg破解64位WinSnap4.5.6图文视频教程
一、软件简单介绍:WinSnap是一个轻巧、快速、简单、友好的截图工具,提供屏幕截图和图像编辑功能。和其它截图软件相比其最大亮点在于WinSnap可以捕获或去除Win7的 Aero玻璃效果。WinSnap内置了阴影,反射,旋转,水印等效果,支持各种图像格式,并支持自动保存。
1709 0
AIX 6.1 Oracle11g 11.2.0.4 RAC 安装心得
在RAC安装过程中涉及多个用户,多种工具,这里列出常见命令提示符: #  UNIX的SHELL提示符,表示root用户的登录 $  UNIX的SHELL提示符,表示oracl用户或grid用户的登录 安装RAC是一个比较耗时,并且容易出错的过程。
998 0
解决在onCreate()过程中获取View的width和Height为0的方法
最近在看Android底层代码的view绘制原理的时候讲到一个很有意思的事情,也是我几年前刚开始学习Android开发的时候比较纳闷的一个问题,如果你不理解Android的底层绘制,请看我之前一片文章对View绘制的简单分析点击打开链接。 那么在onCreate()获取view的width和height会得到0呢,原因是Android的oncreate和onMesure是不同步的,我们在
1658 0
畅通工程,How Many Tables ACM第九天-图论
下面两题的方法是一样的都是并查集的应用; 并查集的重点就是找到祖先节点的过程。 重点在这里:int find(int x){ return p[x] == x ? x : p[x] = find( p[x]); } 不断地递归,递归到找到自己是自己的祖先为止。
1014 0
+关注
乾初
Stay foolish,Stay hungry.
59
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载