首页 > 编程语言 >视频直播源码,android动画小飞机旋转效果

视频直播源码,android动画小飞机旋转效果

时间:2023-04-24 14:12:41浏览次数:49  
标签:动画 canvas float private paint 源码 70 path android

视频直播源码,android动画小飞机旋转效果

 

//小飞机旋转动效果
public class PlaneView extends View {
    private Paint paint;
    private int width;
    private int height;
    private float curLength;
    private float allLength;
    private float mAnimatorValue;
    private PathMeasure pathMeasure;
    private Path path;
    private float[] pos;
    private float[] tan;
    private Bitmap bitmap;
    private Matrix mMatrix;
    private boolean first;
    public PlaneView(Context context) {
        super(context);
        init();
    }
    public PlaneView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public PlaneView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init() {
        paint = new Paint();
        paint.setStrokeWidth(2);
        paint.setAntiAlias(true);
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);
        path = new Path();
        pathMeasure = new PathMeasure();
        first = true;
        pos = new float[2];
        tan = new float[2];
        mMatrix = new Matrix();
        drawbitmap();
        //属性动画
        final ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
        //设置动画过程的监听
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mAnimatorValue = (float) animation.getAnimatedValue();
                postInvalidate();
            }
        });
        valueAnimator.setDuration(2000);
        valueAnimator.setRepeatCount(ValueAnimator.INFINITE);//无限循环
        valueAnimator.start();
    }
    //单独创建一个100,100的bitmap画小飞机
    private void drawbitmap() {
        Canvas canvas = new Canvas();
        bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
        canvas.setBitmap(bitmap);
        Path path = new Path();
        path.moveTo(70, 70);
        path.lineTo(50, 90);
        path.lineTo(50, 50);
        path.close();
        canvas.drawPath(path, paint);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (first) {
            width = getWidth();
            height = getHeight();
            path.addCircle(width / 2, height / 2, 250, Path.Direction.CW);
            pathMeasure.setPath(path, false);
            allLength = pathMeasure.getLength();
            first = false;
        }
        //画坐标轴和圆路径
        canvas.drawLine(width / 2, 0, width / 2, height, paint);
        canvas.drawLine(0, height / 2, width, height / 2, paint);
        canvas.drawPath(path, paint);
        //以curlength获取每一次圆上的点的坐标位置以及正切点位置。
        pathMeasure.getPosTan(curLength, pos, tan);
        // 以当前点的位置计算bitmap要旋转的角度,Math.atan2(tan[1], tan[0])获取弧度值,根据弧度与角度换算公式,Math.atan2(tan[1], tan[0]) * 180.0 / Math.PI为每一次的角度
        float degrees = (float) (Math.atan2(tan[1], tan[0]) * 180.0 / Math.PI);
        // 旋转,以70,70这个飞机头点为旋转基点
        mMatrix.postRotate(degrees, 70, 70);
        //平移,以70,70这个飞机头点为旋平移基点
        mMatrix.postTranslate(pos[0] - 70, pos[1] - 70);
        canvas.drawBitmap(bitmap, mMatrix, paint);
        mMatrix.reset();
        curLength = mAnimatorValue * allLength;
    }
}

 

以上就是 视频直播源码,android动画小飞机旋转效果,更多内容欢迎关注之后的文章

 

标签:动画,canvas,float,private,paint,源码,70,path,android
From: https://www.cnblogs.com/yunbaomengnan/p/17349324.html

相关文章

  • FutureTask源码分析
    1、Callable与FutureTask介绍1.1、Callable创建线程有两种方式,一种是继承Thread类,一种是实现Runnable接口重写run方法。其实Thread也实现了Runable接口。在Runable接口中,仅有一个无参无返回结果的run方法。Runable接口详情:1@FunctionalInterface2publicinterfa......
  • Android Automation
    启动虚拟机 emulator@pixel2-skip-adb-auth-allow-host-audio-port5554-no-snapshot-no-boot-anim-memory3072-partition-size8192启动Appium自动下载ChromeDriverappium--allow-insecurechromedriver_autodownload占位......
  • Map - TreeSet & TreeMap 源码解析
    Java7-TreeSet&TreeMap总体介绍前者仅仅是对后者做了一层包装,也就是说TreeSet里面有一个TreeMap(适配器模式)。因此本文将重点分析TreeMap。JavaTreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natu......
  • Map - LinkedHashSet&Map源码解析
    上篇文章讲了HashMap。HashMap是一种非常常见、非常有用的集合,但在多线程情况下使用不当会有线程安全问题。大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。HashMap的这一缺点往往会......
  • 【深入浅出Spring原理及实战】「源码调试分析」深入源码探索Spring底层框架的的refres
    学习Spring源码的建议阅读Spring官方文档,了解Spring框架的基本概念和使用方法。下载Spring源码,可以从官网或者GitHub上获取。阅读Spring源码的入口类,了解Spring框架的启动过程和核心组件的加载顺序。阅读Spring源码中的注释和文档,了解每个类和方法的作用和用法。调试Spring源码,可以......
  • vue2源码-十三、nextTick在哪里使用?原理是什么?
    nextTick在哪里使用?原理是什么?nextTick内部采用了异步任务进行包装(多个nextTick调用会被合并成一次,内部会合并回调)最后在异步任务中批处理。主要应用场景就是异步更新(默认调度的时候就会添加一个·nextTick任务)用户为了获取最终的渲染结果需要在内部任务执行之后再执行用户逻......
  • 【开源项目】无锡~超经典智慧城市智慧无锡 CIM/BIM数字孪生可视化项目——开源工程及
    智慧无锡免费提供工程和源码,为城市管理和发展提供更智能化的解决方案。项目介绍智慧无锡项目利用数字孪生技术,将无锡市的地理信息、公共数据和实时监测数据进行整合,以数字化形式呈现城市的各种信息和场景。在工程中,利用AI处理地形影像,在溪梁区使用高精度的max模型,其他区域使用AI生......
  • App复杂动画实现——Rive保姆级教程
    作者:京东物流沈明亮在App开发过程中,如果想实现动画效果,可以粗略分为两种方式。一种是直接用代码编写,像平移、旋转等简单的动画效果,都可以这么干,如果稍微复杂点,就会对开发工程师的数学功底、图形图像学功底有很高的要求。另一种方式,可以让UI同学配合,一次性出多张图片或者直接出......
  • Android Tencent Shadow 插件接入指南
    原文地址www.jianshu.com撒盐一、clone仓库二、测试编译三、将Shadow库发布到本地仓库四、宿主接入1添加依赖2添加代理Activity主题3清单文件注册代理Activity4在宿主中创建PluginManager管理工具a创建PluginManager文件升级器b创建插件进程服务c......
  • AQS中的CyclicBarrier源码解析
    packagecn.com.pep;importjava.util.concurrent.BrokenBarrierException;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.TimeoutException;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.ReentrantLock;/**......