Android 仿天通卫星对准(卫星在圆形卫星轨道上转动)效果实现

news2024/11/16 13:36:08

效果图在这里插入图片描述
View源码

package com.android.circlescalebar.view;

import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;
import com.android.circlescalebar.R;

public class SatelliteOrbitView extends View {

    private Paint orbitPaint;
    private Bitmap satelliteBitmap;
    private float orbitRadius;
    private float satelliteAngle;

    public SatelliteOrbitView(Context context) {
        super(context);
        init();
    }

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

    public SatelliteOrbitView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        orbitPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        orbitPaint.setColor(Color.argb(35, 255, 255, 0));
        orbitPaint.setStyle(Paint.Style.STROKE);
        orbitPaint.setStrokeWidth(80);

        // 加载卫星图片
        satelliteBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_satellite);
        orbitRadius = 260; // 轨道半径
        satelliteAngle = 270 % 360; // 初始角度
    }

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

        // 绘制圆形轨道
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, orbitRadius, orbitPaint);

        // 计算卫星位置
        float satelliteX = getWidth() / 2 + orbitRadius * (float) Math.cos(Math.toRadians(satelliteAngle));

        float satelliteY = getHeight() / 2 + orbitRadius * (float) Math.sin(Math.toRadians(satelliteAngle));

       // 绘制卫星
        Rect src = new Rect(0, 0, satelliteBitmap.getWidth(), satelliteBitmap.getHeight());

        Rect dst = new Rect((int) (satelliteX - satelliteBitmap.getWidth() / 6),
                (int) (satelliteY - satelliteBitmap.getHeight() / 6),
                (int) (satelliteX + satelliteBitmap.getWidth() / 6),
                (int) (satelliteY + satelliteBitmap.getHeight() / 6));
        // 卫星跟随轨道对齐
        canvas.rotate(satelliteAngle + 90, satelliteX, satelliteY);
        canvas.drawBitmap(satelliteBitmap, src, dst, null);
    }

    public void startAnimation() {
        ObjectAnimator animator = ObjectAnimator.ofFloat(this, "satelliteAngle", 0, 360);
        animator.setDuration(5000); // 设置动画持续时间
        animator.setInterpolator(new LinearInterpolator()); // 设置插值器
        animator.setRepeatCount(ObjectAnimator.INFINITE); // 设置重复次数为无限
        animator.setRepeatMode(ObjectAnimator.RESTART); // 设置重复模式为重新开始
        animator.start();
    }

    public void setSatelliteAngle(float angle) {
        this.satelliteAngle = (angle + 270)  % 360;
        invalidate(); // 请求重绘视图
    }
}

调用实现

SatelliteOrbitView satelliteOrbitView = findViewById(R.id.satelliteOrbitView);
count = 0;
mHandler.removeCallbacks(mRunnable);
mRunnable = new Runnable() {
    @Override
    public void run() {
        satelliteOrbitView.setSatelliteAngle(count);
        count++;
        if (count > 360) {
            // 停止循环
            mHandler.removeCallbacks(this);
        } else {
            // 继续循环
            mHandler.postDelayed(this, 15); // 每秒更新一次
        }
    }
};
mHandler.post(mRunnable);

布局

<com.android.circlescalebar.view.SatelliteOrbitView
    android:id="@+id/satelliteOrbitView"
    android:layout_width="215dp"
    android:layout_height="215dp"
    android:layout_gravity="center" />

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1517925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux对于文件操作其他命令

tac&#xff0c;与cat不同&#xff0c;tac可以倒序查看文件内容 管道符&#xff0c;可以将第一条命令的结果当作第二条命令的输入 more分屏显示文件内容 head&#xff0c;可以查看文件前多少行&#xff0c;tail可以查看文件后多少行

JavaEE之多线程(创建线程的五种写法)详解

&#x1f63d;博主CSDN主页: 小源_&#x1f63d; &#x1f58b;️个人专栏: JavaEE &#x1f600;努力追逐大佬们的步伐~ 目录 1. 前言 2. 操作系统"内核" 3. 创建线程的五种写法 (我们重点要掌握最后一种写法!!) 3.1 继承 Thread, 重写 run 3. 2 实现 Runnabl…

SpringBoot Servlet容器启动解析

介绍 容器架构 容器处理请求 容器启动全局流程解析 启动前准备 WebServer创建入口 WebServer创建 Servlet启动 Web容器工厂类加载解析 Web容器个性化配置 属性注入 工厂类初始化 BeanPostProcessor方法实现 定制化流程 面试题 请描述下Servlet容器启动流程&#xff1f;介绍下…

最新android icon和splashScreen适配兼容至2024android

android在12做了splashScreen的变动&#xff0c;即&#xff0c;android12有自带的screenSplash过渡&#xff0c;不论你是否自己有变化&#xff0c;都会插入该动画。 android8做了icon的巨大变动。13做了图标的主题兼容。 一、icon制作 制作 使用android自带的工具&#xff0…

Modbus -tcp协议使用第二版

1.1 协议描述 1.1.1 总体通信结构 MODBUS TCP/IP 的通信系统可以包括不同类型的设备&#xff1a; &#xff08;1&#xff09;连接至 TCP/IP 网络的 MODBUS TCP/IP 客户机和服务器设备&#xff1b; &#xff08;2&#xff09;互连设备&#xff0c;例如&#xff1a;在 TCP/IP…

外包干了5天,技术明显退步。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

C# Onnx yolov8 building segmentation

目录 效果 模型信息 项目 代码 下载 C# Onnx yolov8 building segmentation 效果 模型信息 Model Properties ------------------------- date&#xff1a;2023-12-22T10:51:07.627471 author&#xff1a;Ultralytics task&#xff1a;segment license&#xff1a;AGPL-…

HBase分布式数据库的原理和架构

一、HBase简介 HBase是是一个高性能、高可靠性、面向列的分布式数据库&#xff0c;它是为了在廉价的硬件集群上存储大规模数据而设计的。HBase利用Hadoop HDFS作为其文件存储系统&#xff0c;且Hbase是基于Zookeeper的。 二、HBase架构 *图片引用 Hbase采用Master/Slave架构…

YOLOv9(3):YOLOv9损失(Loss)计算

1. 写在前面 YOLOv9的Loss计算与YOLOv8如出一辙&#xff0c;仅存在略微的差异。多说一句&#xff0c;数据的预处理和导入方式都是一样的。因此如果你已经对YOLOv8了解的比较透彻&#xff0c;那么对于YOLOv9你也只是需要多关注网络结构就可以。 YOLOv9本身也是Anchor-Free的&a…

彩虹外链网盘界面UI美化版超级简洁好看

彩虹外链网盘界面UI美化版 彩虹外链网盘&#xff0c;是一款PHP网盘与外链分享程序&#xff0c;支持所有格式文件的上传&#xff0c;可以生成文件外链、图片外链、音乐视频外链&#xff0c;生成外链同时自动生成相应的UBB代码和HTML代码&#xff0c;还可支持文本、图片、音乐、…

机试:成绩排名

问题描述: 代码示例: #include <bits/stdc.h> using namespace std;int main(){cout << "样例输入" << endl; int n;int m;cin >> n;int nums[n];for(int i 0; i < n; i){cin >> nums[i];}// 排序for(int i 0; i < n; i){//…

Leetcode 3.14

Leetcode hot100 二叉树1.二叉树的层序遍历2.验证二叉搜索树3.二叉树的右视图 二叉树 1.二叉树的层序遍历 二叉树的层序遍历 二叉树的层序遍历可以用先进先出的队列来实现。 将每一层的所有node都添加到队列中&#xff0c;记录下当前队列的长度&#xff0c;即该层的元素数量&…

Java操作Sql语句 出现迭代死循环 (Bug排查)

目录 1. 问题所示2. 原理分析3. 解决方法4. 彩蛋1. 问题所示 Java执行Sql语句来查询一些数据的时候 虽说数据量很大,但是查询过程中一直迭代查询 截图如下所示: 2. 原理分析 至于迭代死循环,可能是不满足的条件也进入查询(本身我的数据量就很大) 主要可能引起的两个原…

创新发展,探索智慧园区平台架构设计与实现

随着信息技术的快速发展&#xff0c;智慧园区平台作为集成物联网、大数据、人工智能等技术的综合性服务平台&#xff0c;正逐步成为推动企业数字化转型的重要驱动力。本文将深入探讨智慧园区平台的架构设计思路、关键技术和应用场景&#xff0c;助力读者了解如何打造智慧化、协…

【洛谷 P8637】[蓝桥杯 2016 省 B] 交换瓶子 题解(贪心算法)

[蓝桥杯 2016 省 B] 交换瓶子 题目描述 有 N N N 个瓶子&#xff0c;编号 1 ∼ N 1 \sim N 1∼N&#xff0c;放在架子上。 比如有 5 5 5 个瓶子&#xff1a; 2 , 1 , 3 , 5 , 4 2,1,3,5,4 2,1,3,5,4 要求每次拿起 2 2 2 个瓶子&#xff0c;交换它们的位置。 经过若干次…

linux查看服务器登录成功和登录失败的命令

last 查看成功登录服务器的信息&#xff0c;包括ip&#xff0c;时间&#xff0c;登录用户&#xff0c;时长。lastb 查看登录服务器失败的信息。 last命令实例&#xff1a; 其他参数&#xff1a; -a&#xff1a;把从何处登入系统的主机名称或ip地址&#xff0c;显示在最后一行…

sqllab第十一关通关笔记

知识点&#xff1a; 发现登录框就可以尝试注入登录框一般都是字符型注入通过注入可以获取其他表的信息绕过手段 单引号闭合联合注入也可以进行错误注入 首先看界面是一个登录框&#xff1b;通过admin admin登录进去&#xff0c;发现页面会把用户名和密码的登录信息打印出来&am…

Node.js入门基础—day01

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;给自己一个梦想&#xff0c;给世界一个惊喜。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章目录 初识node.js什…

sqllab第二十一关通关笔记

知识点&#xff1a; 错误注入 最大长度为32超过需要利用截取函数分段读取cookie注入base64加密会保留符号的原始属性 通过admin admin进行登录发现和第二十关显示的内容一样&#xff0c;猜测应该还是cookie注入&#xff1b; 直接截取带有cookie的数据包&#xff0c;发现uname…

使用canvas实现图纸标记及回显

图纸 图纸标记后的效果图 最近做的一个qms项目里面&#xff0c;需要前端在图纸上实现标记及标记后的内容还要能够回显&#xff0c;然后后端通过标记的点&#xff0c;去读取标记图纸的内容&#xff0c;如一些公式、数据之类的&#xff0c;目前实现的功能有 在图纸上面进行矩形…