自定义View--弹性小球

效果图

自定义代码

public class BezierView extends View {

    Paint paint;//画笔
    Path path;//路径

    int radius = 50;//圆的半径
    int time = 100;//计数时长

    int index;
    int offsetIndex;
    float viewX, viewY;//图形中心点坐标

    float width;//屏幕宽度
    float partWidth;//屏幕宽度的1/4
    int paddingLeft, paddingRight;//图形内边距
    float x1, y1, x2, y2, x3, y3, x4, y4;//圆形左上右下四个点

    float x12, y12, x23, y23, x34, y34, x41, y41;//圆形左上右下四个点之间的渐变点

    public BezierView(Context context) {
        this(context, null);
    }

    public BezierView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BezierView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        paint = new Paint();
        paint.setColor(ResourcesCompat.getColor(getResources(), R.color.colorPrimary, null));
        paint.setAntiAlias(true);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        paddingLeft = getPaddingLeft();
        paddingRight = getPaddingRight();
        width = getWidth() - paddingLeft - paddingRight;
        partWidth = width / 4;

        path = new Path();
        path.moveTo(x1, y1);
        path.cubicTo(x1, y1, x12, y12, x2, y2);
        path.cubicTo(x2, y2, x23, y23, x3, y3);
        path.cubicTo(x3, y3, x34, y34, x4, y4);
        path.cubicTo(x4, y4, x41, y41, x1, y1);
        canvas.drawPath(path, paint);

        move();
    }

    public void move() {
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                if (index < time - 1) {
                    index++;
                    viewX = width / time * index + paddingLeft;
                    viewY = 400;

                    x1 = viewX - radius;
                    x2 = viewX;
                    x3 = viewX + radius;
                    x4 = viewX;

                    y1 = viewY;
                    y2 = viewY - radius;
                    y3 = viewY;
                    y4 = viewY + radius;

                    offsetIndex = index % (time / 4) + 1;

                    //根据图形移动到的区域进行曲线变化
                    float position = (viewX - paddingLeft) / partWidth;

                    //右边半圆
                    if (position >= 0 && position < 1) {
                        x3 = viewX + radius + radius / (time / 4) * offsetIndex;
                    } else if (position >= 1 && position < 2) {
                        x3 = viewX + radius + radius;
                    } else if (position >= 2 && position < 3) {
                        x3 = viewX + radius + radius - radius / (time / 4) * offsetIndex;
                    } else {
                        x3 = viewX + radius;
                    }
                    x23 = x34 = x3;
                    y12 = y23 = y2;

                    //左边半圆
                    if (position >= 1 && position < 2) {
                        x1 = viewX - radius - radius / (time / 4) * offsetIndex;
                    } else if (position >= 2 && position < 3) {
                        x1 = viewX - radius - radius;
                    } else if (position >= 3) {
                        x1 = viewX - radius - radius + radius / (time / 4) * offsetIndex;
                    } else {
                        x1 = viewX - radius;
                    }
                    x12 = x41 = x1;
                    y34 = y41 = y4;

                    postInvalidate();
                } else {
                    cancel();
                }
            }
        }, 0, 5000);
    }

}
时间: 2025-01-13 16:11:53

自定义View--弹性小球的相关文章

自定义View,随着手指运动的小球

这个实例是自定的view的初步介绍,要设计的是一个随着手指运动的小球.原理是随时获取手指的坐标,然后在这个坐标上面实时改变自定义view的坐标.这个view仅仅是画了一个圆形而已. 自定义的view DrawView.java package com.kale.drawview; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; impor

自定义View实现跟随手指的小球

package com.pingyijinren.test; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; /** * Created by Administrator on

Android进阶——自定义View之自己绘制彩虹圆环调色板

引言 前面几篇文章都是关于通过继承系统View和组合现有View来实现自定义View的,刚好由于项目需要实现一个滑动切换LED彩灯颜色的功能,所以需要一个类似调色板的功能,随着手在调色板有效区域滑动,LED彩灯随即显示相应的颜色,也可以通过左右的按钮,按顺序切换显示一组颜色,同时都随着亮度的改变LED彩灯的亮度随即变化,这篇基本上把继承View重绘实现自定义控件的大部分知识总结了下(当然还有蛮多没有涉及到,比如说自适应布局等),源码在Github上 一.继承View绘制自定义控件的通用步骤 自定

自定义View实现钟摆效果进度条PendulumView

在网上看到了一个IOS组件PendulumView,实现了钟摆的动画效果.由于原生的进度条确实是不好看,所以想可以自定义View实现这样的效果,以后也可以用于加载页面的进度条. 废话不多说,先上效果图 底部黑边是录制时不小心录上的,可以忽略. 既然是自定义View我们就按标准的流程来,第一步,自定义属性自定义属性 建立属性文件 在Android项目的res->values目录下新建一个attrs.xml文件,文件内容如下: [html] view plain copy <?xml versio

Android_自定义View之跳动的loading

这篇文章记录一下Android自定义UI的知识,一个小小的跳动的loading,特别感谢Nil的指点-废话不多,先来效果 SoHOT链接和star地址:SoHOT源码地址,在文章最后最后有github开源地址,别错过 如果您还没有去给SoHOT一颗star而直接看这个项目,那简直是有点损失,希望您点上面的链接,去star和下载体验一下SoHoT,捡起那个大西瓜再来捡这个小芝麻项目,你懂的!! 凑乎看吧,录制的效果不如真机上平滑-凑乎看吧. 1,自定义View的自定义属性提取 2,View中动画的

Android自定义View

自定义view package com.bawei.brush; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; public class Line extends View

自定义View之案列篇(三):仿QQ小红点

光棍节快到了,提前祝愿广大的单身猿猴,早日脱单,尽快找到另一半. 一直觉得 QQ 的小红点非常具有创新,新颖.要是自己也能实现类似的效果,那怎一个爽字了得. 先来看看它的最终效果: 效果图具有哪些效果: 在拉伸范围内的拉伸效果 未拉出拉伸范围释放后的效果 拉出拉伸范围再拉回的释放后的效果 拉出拉伸范围释放后的爆炸效果 涉及的相关知识点: onLayout 视图位置 saveLayer 图层相关知识 Path 的贝赛尔曲线 手势监听 ValueAnimator 属性动画 一.拉伸效果 我们先来讲解

【Android自定义View实战】之仿百度加载动画,一种优雅的Loading方式

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53470872 本文出自[DylanAndroid的博客] Android自定义View实战之仿百度加载动画一种优雅的Loading方式 第一个仿百度加载动画用ObjectAnimator属性动画操作ImageView的属性方法实现 第二个仿百度加载动画第二种实现方式用ValueAnimator原生的ondraw方法实现 第三个扔球动画-水平旋转动画 第四个扔球动画-垂直旋转动

自定义View实现广告位轮播图barner组件

闲谈 最近公司事情不算太多,闲来无事,看到项目中用到的广告轮播图,之前都是使用第三方的,趁事情不算多,所以自己实现一个广告位轮播图barner组件,这样的话,在以后的开发中就可以使用自己的了. 知识点 好了,切入正题!我们要想实现barner组件,首先要求我们需要哪些知识点呢? 1.自定义View的流程(测量.布局.绘制) 2.广告位轮播图滑动的时候,我们需要弹性滑动Scroller 3.自定义View的事件传递机制 4.在我们自定义View事件传递给我们自定义的View的时候,我们在OnTou

Android开发自定义View

Android中View组件的作用类似于Swing变成中的JPanel,它只是一个空白的矩形区域,View组件中没有任何内容.对于Android应用的其他UI组件来说,它们都继承了View组件,然后在View组件提供的空白区域绘制外观. 当Android系统提供的UI组件不足以满足项目需求时,我们可以通过继承View并重写View类的一个或多个方法来自定义组件. 通常可以被用户重写的方法如下: 1.构造器:重写构造器是定制View的最基本的方式,当Java(或Kotlin)代码创建一个View实