android开发之实现动态打勾效果(DrawHookView)

今天产品中要实现这样的需求,想了想还是把它给整出来了! 

第一步:自定义View 
实现步骤: 
1、先画好圆弧 
2、再画第一根线 
3、最后再画第二根线

/**
 * DrawHook
 * Created by Zane on 2015/3/4.
 */
public class DrawHookView extends View {
    //绘制圆弧的进度值
    private int progress = 0;
    //线1的x轴
    private int line1_x = 0;
    //线1的y轴
    private int line1_y = 0;
    //线2的x轴
    private int line2_x = 0;
    //线2的y轴
    private int line2_y = 0;

    public DrawHookView(Context context) {
        super(context);
    }

    public DrawHookView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DrawHookView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    //绘制

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        progress++;

        /**
         * 绘制圆弧
         */
        Paint paint = new Paint();
        //设置画笔颜色
        paint.setColor(getResources().getColor(R.color.arc_blue));
        //设置圆弧的宽度
        paint.setStrokeWidth(5);
        //设置圆弧为空心
        paint.setStyle(Paint.Style.STROKE);
        //消除锯齿
        paint.setAntiAlias(true);

        //获取圆心的x坐标
        int center = getWidth() / 2;
        int center1 = center - getWidth() / 5;
        //圆弧半径
        int radius = getWidth() / 2 - 5;

        //定义的圆弧的形状和大小的界限
        RectF rectF = new RectF(center - radius -1, center - radius -1 ,center + radius + 1, center + radius + 1);

        //根据进度画圆弧
        canvas.drawArc(rectF, 235, -360 * progress / 100, false, paint);

        /**
         * 绘制对勾
         */
        //先等圆弧画完,才话对勾
        if(progress >= 100) {
            if(line1_x < radius / 3) {
                line1_x++;
                line1_y++;
            }
            //画第一根线
            canvas.drawLine(center1, center, center1 + line1_x, center + line1_y, paint);

            if (line1_x == radius / 3) {
                line2_x = line1_x;
                line2_y = line1_y;
                line1_x++;
                line1_y++;
            }
            if (line1_x >= radius / 3 && line2_x <= radius) {
                line2_x++;
                line2_y--;
            }
            //画第二根线
            canvas.drawLine(center1 + line1_x - 1, center + line1_y, center1 + line2_x, center + line2_y, paint);
        }

        //每隔10毫秒界面刷新
        postInvalidateDelayed(10);
    }
}

第二步:布局文件引用自定义View

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@color/color_fff"
        >
    <com.offcn.DrawHookViewDemo.DrawHookView
            android:layout_width="90dp"
            android:layout_height="90dp"
            android:layout_centerInParent="true"
            />
</RelativeLayout>

附colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="arc_blue">#10a679</color>
    <color name="color_fff">#ffffff</color>
</resources>

示例代码戳Here

https://github.com/ZaneLove/DrawHookView

时间: 2024-08-06 21:11:52

android开发之实现动态打勾效果(DrawHookView)的相关文章

android开发如何声明动态一维数组

问题描述 android开发如何声明动态一维数组 我是一个Android新手,我现在想读取一个文件,文件大小未知,我想用 byte[] buffer = new byte[3072]; temp_stream = new FileInputStream(img_name); temp_stream.read(buffer); buffer接收,如何声明一个动态byte[] buffer. 解决方案 Java获得文件大小的方法(通过FileInputStream) 根据指定文件创建FileInpu

Android开发仿映客送礼物效果_Android

这里写链接内容仿映客送小礼物的特效,顺便复习一下属性动画,话不多说先看效果图. 需求分析 可以看到整个动画有几部分组成,那我们就把每个部分拆分出来各个击破. 1.要显示那些内容以及内容间的位置关系? 可以看到我们要显示用户头像,昵称,礼物图标以及数量.所以这里我选择用FrameLayout来作为根布局. 2.需要哪些动画以及动画的执行顺序? a.首先是整体从左到右飞入并有一个回弹(translationX + OvershootInterpolator) b.然后是礼物从左到右飞入而且是一个带减

Android开发中MJRefresh自定义刷新动画效果_Android

[一]常见用法 最原始的用法,耦合度低,但是不能统一管理.我们需要在每一个控制器都写以下代码,很繁琐,以后项目修改起来更繁琐,得一个控制器一个控制器的去定位.修改. 1.1 使用默认刷新(耦合度底,但是想统一修改起来特别麻烦) self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ //在这里执行刷新操作 }]; self.tableView.mj_header = [MJRefreshNorm

Android开发中Listview动态加载数据的方法示例

本文实例讲述了Android开发中Listview动态加载数据的方法.分享给大家供大家参考,具体如下: 最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到Listview中.我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非常不好.我的想法是动态加载数据,第一次加载十条,然后往下面滑动的时候再追加十条,再往下面滑动的时候再去追加,这样大大减少了用户等待的时间,同时给处理数据留下了时间.网上看到了这样一

Android开发中MJRefresh自定义刷新动画效果

[一]常见用法 最原始的用法,耦合度低,但是不能统一管理.我们需要在每一个控制器都写以下代码,很繁琐,以后项目修改起来更繁琐,得一个控制器一个控制器的去定位.修改. 1.1 使用默认刷新(耦合度底,但是想统一修改起来特别麻烦) self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ //在这里执行刷新操作 }]; self.tableView.mj_header = [MJRefreshNorm

Android开发仿映客送礼物效果

这里写链接内容仿映客送小礼物的特效,顺便复习一下属性动画,话不多说先看效果图. 需求分析 可以看到整个动画有几部分组成,那我们就把每个部分拆分出来各个击破. 1.要显示那些内容以及内容间的位置关系? 可以看到我们要显示用户头像,昵称,礼物图标以及数量.所以这里我选择用FrameLayout来作为根布局. 2.需要哪些动画以及动画的执行顺序? a.首先是整体从左到右飞入并有一个回弹(translationX + OvershootInterpolator) b.然后是礼物从左到右飞入而且是一个带减

Android视频处理之动态时间水印效果_Android

最近的项目中遇到一个非常头痛的需求,在Android端录制视频的时候动态添加像监控画面一样的精确到秒的时间信息,关键是,并不是说只在播放器的界面显示时间就可以了,而是录制到视频里面去,这个MP4在电脑上播放也能看到每个画面的时间. 最后想到的办法是在录制完成以后去处理这个视频. 期间参考了很多资料,比较有用的大概是ffmpeg和比较新的Api mediaCodec系列了.介于ffmpeg都是C实现,和一大堆NDK相关,本人不是太懂,就重点关注了MediaCodec系列. 参考逻辑流程图一目了然的

【Android开发】范例2-实现放大镜效果

利用之前学过的图形图像绘画技术和图片添加特效技术,我们来实现一个Android放大镜的简单应用. 最终效果如图 具体实现: 用来显示自定义的绘图类的布局文件 res/layout/main.xml: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns

Android仿简书动态searchview搜索栏效果

简书的动态搜索栏效果是这样的,挺高大上的感觉. ezgif.com-resize.gif 仔细想一下,其实实现起来非常简单,这是我做的效果,基本完美还原. ezgif.com-resize (2).gif 实现这个效果, 只要关注几个点 1.搜索栏伸展和收缩动画效果实现 2.搜索栏伸展和收缩的时机 3.顶部透明度的渐变 搜索栏伸展和收缩动画效果实现: 我们只要明确,使用系统为我们提供的Transition框架,就可以轻而易举的实现了. 首先要引入依赖compile 'com.android.su