当前位置: 首页 > news >正文

【Android】Wallpaper学习

从wallpaper的设置来了解相关内容:

一,静态壁纸

静态壁纸设置的原理是在WallpaperManagerService里监听/data/system/users/0/wallpaper_orig相关文件的变化来触发设置,通过相应的组件程序去进行绘制,

相应的组件如:

mWallpaperComponent=ComponentInfo{com.android.systemui/com.android.systemui.wallpapers.ImageWallpaper}

  Wallpaper connection com.android.server.wallpaper.WallpaperManagerService$WallpaperConnection@739a4fa:

以下是一个简单的 Android 程序示例,展示如何设置设备的壁纸。程序会从资源文件中加载一张图片,并将其设置为设备的主屏幕壁纸。

1. 项目结构
(1) 添加权限
在 AndroidManifest.xml 中添加设置壁纸的权限:

Xml
深色版本
<uses-permission android:name="android.permission.SET_WALLPAPER" />
(2) 准备壁纸图片
将你想要设置为壁纸的图片放入 res/drawable 目录中,例如命名为 wallpaper_image.jpg。

2. 代码实现
(1) 主 Activity (MainActivity.java)
创建一个按钮,点击后设置壁纸。

Java
深色版本
package com.example.setwallpaper;

import android.app.WallpaperManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取按钮控件
        Button setWallpaperButton = findViewById(R.id.set_wallpaper_button);

        // 设置按钮点击事件
        setWallpaperButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setWallpaper();
            }
        });
    }

    private void setWallpaper() {
        // 获取 WallpaperManager 实例
        WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext());

        try {
            // 加载图片资源
            Bitmap wallpaperBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.wallpaper_image);

            // 设置壁纸
            wallpaperManager.setBitmap(wallpaperBitmap);

            // 提示用户成功设置壁纸
            Toast.makeText(MainActivity.this, "壁纸设置成功!", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            // 捕获异常并提示用户失败
            Toast.makeText(MainActivity.this, "壁纸设置失败!", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }
}
(2) 布局文件 (activity_main.xml)
定义一个按钮,用于触发设置壁纸的操作。

Xml
深色版本
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <Button
        android:id="@+id/set_wallpaper_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="设置壁纸" />

</LinearLayout>
3. 运行效果
启动应用后,界面会显示一个按钮。
点击按钮后,应用会从资源文件中加载图片,并将其设置为主屏幕的壁纸。
如果设置成功,会弹出一个 Toast 提示 "壁纸设置成功!";如果失败,则会提示 "壁纸设置失败!"。
4. 扩展功能
(1) 支持锁屏壁纸
如果你想同时设置主屏幕和锁屏壁纸,可以使用以下代码:

Java
深色版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    // 设置主屏幕壁纸
    wallpaperManager.setBitmap(wallpaperBitmap, null, true, WallpaperManager.FLAG_SYSTEM);

    // 设置锁屏壁纸
    wallpaperManager.setBitmap(wallpaperBitmap, null, true, WallpaperManager.FLAG_LOCK);
} else {
    // 对于低版本系统,只能设置主屏幕壁纸
    wallpaperManager.setBitmap(wallpaperBitmap);
}
(2) 从相册选择图片
你可以通过 Intent 让用户从相册中选择一张图片作为壁纸:

Java
深色版本
private static final int PICK_IMAGE_REQUEST = 1;

private void openGallery() {
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, PICK_IMAGE_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null) {
        try {
            // 获取选中的图片 URI
            Uri imageUri = data.getData();

            // 将图片转换为 Bitmap
            Bitmap wallpaperBitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);

            // 设置壁纸
            WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext());
            wallpaperManager.setBitmap(wallpaperBitmap);

            // 提示用户成功设置壁纸
            Toast.makeText(this, "壁纸设置成功!", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "壁纸设置失败!", Toast.LENGTH_SHORT).show();
        }
    }
}
5. 注意事项
权限问题:
设置壁纸不需要动态申请权限,但如果你从相册选择图片,则需要处理运行时权限(如 READ_EXTERNAL_STORAGE)。

setBitmap的调用,可以查看WallpaperManager.java

    public int setBitmap(Bitmap fullImage, Rect visibleCropHint,boolean allowBackup, @SetWallpaperFlags int which, int userId)throws IOException {validateRect(visibleCropHint);if (sGlobals.mService == null) {Log.w(TAG, "WallpaperService not running");throw new RuntimeException(new DeadSystemException());}final Bundle result = new Bundle();final WallpaperSetCompletion completion = new WallpaperSetCompletion();try {ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(null,mContext.getOpPackageName(), visibleCropHint, allowBackup,result, which, completion, userId);if (fd != null) {FileOutputStream fos = null;try {fos = new ParcelFileDescriptor.AutoCloseOutputStream(fd);fullImage.compress(Bitmap.CompressFormat.PNG, 90, fos);fos.close();completion.waitForCompletion();} finally {IoUtils.closeQuietly(fos);}}} catch (RemoteException e) {throw e.rethrowFromSystemServer();}return result.getInt(EXTRA_NEW_WALLPAPER_ID, 0);}

调用到setWallpaper方法

   @Override
3009      public ParcelFileDescriptor setWallpaper(String name, String callingPackage,
3010              Rect cropHint, boolean allowBackup, Bundle extras, int which,
3011              IWallpaperManagerCallback completion, int userId) {
3012          userId = ActivityManager.handleIncomingUser(getCallingPid(), getCallingUid(), userId,
3013                  false /* all */, true /* full */, "changing wallpaper", null /* pkg */);
3014          checkPermission(android.Manifest.permission.SET_WALLPAPER);
3015  
3016          if ((which & (FLAG_LOCK|FLAG_SYSTEM)) == 0) {
3017              final String msg = "Must specify a valid wallpaper category to set";
3018              Slog.e(TAG, msg);
3019              throw new IllegalArgumentException(msg);
3020          }
3021  
3022          if (!isWallpaperSupported(callingPackage) || !isSetWallpaperAllowed(callingPackage)) {
3023              return null;
3024          }
3025  
3026          // "null" means the no-op crop, preserving the full input image
3027          if (cropHint == null) {
3028              cropHint = new Rect(0, 0, 0, 0);
3029          } else {
3030              if (cropHint.width() < 0 || cropHint.height() < 0
3031                      || cropHint.left < 0
3032                      || cropHint.top < 0) {
3033                  throw new IllegalArgumentException("Invalid crop rect supplied: " + cropHint);
3034              }
3035          }
3036  
3037          synchronized (mLock) {
3038              if (DEBUG) Slog.v(TAG, "setWallpaper which=0x" + Integer.toHexString(which));
3039              WallpaperData wallpaper;
3040              final WallpaperData originalSystemWallpaper = mWallpaperMap.get(userId);
3041              final boolean systemIsStatic =
3042                      originalSystemWallpaper != null && mImageWallpaper.equals(
3043                              originalSystemWallpaper.wallpaperComponent);
3044              final boolean systemIsBoth = mLockWallpaperMap.get(userId) == null;
3045  
3046              /* If we're setting system but not lock, and lock is currently sharing the system
3047               * wallpaper, we need to migrate that image over to being lock-only before
3048               * the caller here writes new bitmap data.
3049               */
3050              if (which == FLAG_SYSTEM && systemIsStatic && systemIsBoth) {
3051                  Slog.i(TAG, "Migrating current wallpaper to be lock-only before"
3052                          + " updating system wallpaper");
3053                  if (!migrateStaticSystemToLockWallpaperLocked(userId)
3054                          && !isLockscreenLiveWallpaperEnabled()) {
3055                      which |= FLAG_LOCK;
3056                  }
3057              }
3058  
3059              wallpaper = getWallpaperSafeLocked(userId, which);
3060              if (mPendingMigrationViaStatic != null) {
3061                  Slog.w(TAG, "Starting new static wp migration before previous migration finished");
3062              }
3063              mPendingMigrationViaStatic = new WallpaperDestinationChangeHandler(wallpaper);
3064              final long ident = Binder.clearCallingIdentity();
3065              try {
3066                  ParcelFileDescriptor pfd = updateWallpaperBitmapLocked(name, wallpaper, extras);
3067                  if (pfd != null) {
3068                      wallpaper.imageWallpaperPending = true;
3069                      wallpaper.mSystemWasBoth = systemIsBoth;
3070                      wallpaper.mWhich = which;
3071                      wallpaper.setComplete = completion;
3072                      wallpaper.fromForegroundApp = isFromForegroundApp(callingPackage);
3073                      wallpaper.cropHint.set(cropHint);
3074                      wallpaper.allowBackup = allowBackup;
3075                      wallpaper.mWallpaperDimAmount = getWallpaperDimAmount();
3076                  }
3077                  return pfd;
3078              } finally {
3079                  Binder.restoreCallingIdentity(ident);
3080              }
3081          }
3082      }

又调用到

updateWallpaperBitmapLocked

3121      ParcelFileDescriptor updateWallpaperBitmapLocked(String name, WallpaperData wallpaper,
3122              Bundle extras) {
3123          if (name == null) name = "";
3124          try {
3125              File dir = getWallpaperDir(wallpaper.userId);
3126              if (!dir.exists()) {
3127                  dir.mkdir();
3128                  FileUtils.setPermissions(
3129                          dir.getPath(),
3130                          FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
3131                          -1, -1);
3132              }
3133              ParcelFileDescriptor fd = ParcelFileDescriptor.open(wallpaper.wallpaperFile,
3134                      MODE_CREATE|MODE_READ_WRITE|MODE_TRUNCATE);
3135              if (!SELinux.restorecon(wallpaper.wallpaperFile)) {
3136                  Slog.w(TAG, "restorecon failed for wallpaper file: " +
3137                          wallpaper.wallpaperFile.getPath());
3138                  return null;
3139              }
3140              wallpaper.name = name;
3141              wallpaper.wallpaperId = makeWallpaperIdLocked();
3142              if (extras != null) {
3143                  extras.putInt(WallpaperManager.EXTRA_NEW_WALLPAPER_ID, wallpaper.wallpaperId);
3144              }
3145              // Nullify field to require new computation
3146              wallpaper.primaryColors = null;
3147              Slog.v(TAG, "updateWallpaperBitmapLocked() : id=" + wallpaper.wallpaperId
3148                      + " name=" + name + " file=" + wallpaper.wallpaperFile.getName());
3149              return fd;
3150          } catch (FileNotFoundException e) {
3151              Slog.w(TAG, "Error setting wallpaper", e);
3152          }
3153          return null;
3154      }

二,动态壁纸

在 Android 中开发动态壁纸需要使用 WallpaperService 和 Engine 类。动态壁纸本质上是一个服务,它运行在后台并持续渲染内容到用户的主屏幕或锁屏上。

以下是开发一个简单动态壁纸的步骤和示例代码:

1. 创建动态壁纸项目
(1) 添加权限
在 AndroidManifest.xml 中声明动态壁纸服务,并添加必要的权限。

Xml
深色版本
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.dynamicwallpaper">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        
        <!-- 动态壁纸服务 -->
        <service
            android:name=".MyWallpaperService"
            android:label="@string/wallpaper_label"

android:exported="true"

            android:permission="android.permission.BIND_WALLPAPER">
            
            <intent-filter>
                <action android:name="android.service.wallpaper.WallpaperService" />
            </intent-filter>

            <!-- 动态壁纸预览图 -->
            <meta-data
                android:name="android.service.wallpaper"
                android:resource="@xml/wallpaper_info" />
        </service>
    </application>
</manifest>
(2) 创建动态壁纸元数据文件
在 res/xml 目录下创建一个 XML 文件(例如 wallpaper_info.xml),用于描述动态壁纸的元信息。

Xml
深色版本
<wallpaper
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:thumbnail="@drawable/thumbnail_image"
    android:description="@string/wallpaper_description"
    android:settingsActivity="com.example.dynamicwallpaper.SettingsActivity" />
android:thumbnail:动态壁纸的缩略图。
android:description:动态壁纸的描述。
android:settingsActivity(可选):设置界面的 Activity。
2. 实现动态壁纸服务
(1) 继承 WallpaperService
创建一个类继承 WallpaperService,并实现其抽象方法。


package com.example.dynamicwallpaper;

import android.service.wallpaper.WallpaperService;
import android.view.SurfaceHolder;

public class MyWallpaperService extends WallpaperService {

    @Override
    public Engine onCreateEngine() {
        return new MyWallpaperEngine();
    }

    private class MyWallpaperEngine extends Engine {

        private boolean isVisible = false;

private final Handler handler = new Handler();

        @Override
        public void onCreate(SurfaceHolder surfaceHolder) {
            super.onCreate(surfaceHolder);
            // 初始化操作
        }

        @Override
        public void onVisibilityChanged(boolean visible) {
            this.isVisible = visible;
            if (visible) {
                drawFrame();
            }
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            // 清理资源
        }

        private void drawFrame() {
            if (!isVisible) {
                return;
            }

            SurfaceHolder holder = getSurfaceHolder();
            Canvas canvas = null;

            try {
                canvas = holder.lockCanvas();
                if (canvas != null) {
                    // 在这里绘制你的动态内容
                    drawOnCanvas(canvas);
                }
            } finally {
                if (canvas != null) {
                    holder.unlockCanvasAndPost(canvas);
                }
            }

            // 循环绘制下一帧
            handler.removeCallbacks(drawRunner);
            if (isVisible) {
                handler.postDelayed(drawRunner, 16); // 每 16ms 更新一次(约 60fps)
            }
        }

        private final Runnable drawRunner = new Runnable() {
            @Override
            public void run() {
                drawFrame();
            }
        };

        private void drawOnCanvas(Canvas canvas) {
            // 示例:绘制一个简单的渐变色背景
            Paint paint = new Paint();
            LinearGradient gradient = new LinearGradient(
                    0, 0, canvas.getWidth(), canvas.getHeight(),
                    Color.RED, Color.BLUE, Shader.TileMode.CLAMP);
            paint.setShader(gradient);
            canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint);
        }
    }
}
3. 运行和测试
安装应用:
将 APK 安装到设备上。
设置动态壁纸:
打开设备的 设置 > 壁纸 > 选择壁纸。

这里可以看到注册了wallpaperService的程序


找到你的动态壁纸并设置。
查看效果:
返回主屏幕,你应该能看到动态壁纸在运行。

设置动态壁纸的log

04-20 20:39:25.432  2392  3859 W WallpaperManagerService: getWallpaperIdForUser wallpaper = WallpaperData@f4ca951, id: 10, which: 6, file mod: 1745150434978, no connection, type = 0, userId = 0, uri= null, wallpaperComponent = null, nextWallpaperComponent = null
04-20 20:39:34.437  2392  2705 D SemWallpaperManagerService: getModeEnsuredWhich: detected which = 7
04-20 20:39:34.437  2392  2705 V WallpaperManagerService: setWallpaperComponent name=ComponentInfo{com.example.testmac/com.example.testmac.MyWallpaperService} , which = 7 , coverWallpaperInfo = null
04-20 20:39:34.438  2392  2705 D WALLPAPER_SVC:WallpaperManagerService: Wallpaper file is changed or deleted. Delete previous cropped bitmap
04-20 20:39:34.449  2392  2705 D WALLPAPER_SVC:WallpaperManagerService: bindComponentNow 7
04-20 20:39:34.449  2392  2705 V WallpaperManagerService: bindWallpaperComponentLocked: componentName=ComponentInfo{com.example.testmac/com.example.testmac.MyWallpaperService} force=false
04-20 20:39:34.449  2392  2705 D WallpaperManagerService: WPMS.bindWallpaperComponentLocked-ComponentInfo{com.example.testmac/com.example.testmac.MyWallpaperService}
04-20 20:39:34.454  2392  2705 D WALLPAPER_SVC:WallpaperManagerService: bindService success connect : com.android.server.wallpaper.WallpaperManagerService$WallpaperConnection@c843b0d
04-20 20:39:34.454  2392  2392 D WallpaperManagerService: WPMS.onServiceConnected-ComponentInfo{com.example.testmac/com.example.testmac.MyWallpaperService}
04-20 20:39:34.456  2392  2705 V WallpaperManagerService: Removing window token: android.os.Binder@56ab743 , mDisplayId = 0
04-20 20:39:34.459  2392  2705 D WallpaperManagerService: wallpaper userId = 0 , current user Id = 0
04-20 20:39:34.460  2392  2705 V WallpaperManagerService: WPMS.bindWallpaperComponentLocked-ComponentInfo{com.example.testmac/com.example.testmac.MyWallpaperService} took to complete: 11ms
04-20 20:39:34.466  2392  2705 V WallpaperManagerService: notifyWallpaperColorsChangedOnDisplay 1

调用到bindWallpaperComponentLocked

广播

参考资料:

Android动态壁纸实现与WallPaPerService教程-CSDN博客

【安卓笔记】wallpaper设置系统主页墙纸的一种方法_android wallpaperservice-CSDN博客

Android T wallpaper相关流程_android wallpaperservice-CSDN博客

相关文章:

【Android】Wallpaper学习

从wallpaper的设置来了解相关内容&#xff1a; 一&#xff0c;静态壁纸 静态壁纸设置的原理是在WallpaperManagerService里监听/data/system/users/0/wallpaper_orig相关文件的变化来触发设置&#xff0c;通过相应的组件程序去进行绘制&#xff0c; 相应的组件如&#xff1a…...

Java基础-第一章、基本数据类型

运算符&#xff1a; 1.算术运算符&#xff1a;加减乘除%等 2.逻辑运算符&#xff1a;与或非等 3.关系运算符&#xff1a;大于、小于... 4.赋值运算符&#xff1a; 这里牵扯运算符的运算先后顺序了。 赋值运算的返回值&#xff1a;就是赋值的变量本身...

《Operating System Concepts》阅读笔记:p748-p748

《Operating System Concepts》学习第 64 天&#xff0c;p748-p748 总结&#xff0c;总计 1 页。 一、技术总结 1.Transmission Control Protocol(TCP) 重点是要自己能画出其过程&#xff0c;这里就不赘述了。 二、英语总结(生词&#xff1a;3) transfer, transport, tran…...

Arduino示例代码讲解:Project 08 - Digital Hourglass 数字沙漏

Arduino示例代码讲解:Project 08 - Digital Hourglass 数字沙漏 Project 08 - Digital Hourglass 数字沙漏程序功能概述功能:硬件要求:输出:代码结构全局变量`setup()` 函数`loop()` 函数计时和点亮LED:读取倾斜开关状态:重置LED和计时器:运行过程注意事项Project 08 - …...

报告总结笔记 | Jeff Dean ETH AI趋势 笔记:AI 的重要趋势:我们是如何走到今天的,我们现在能做什么,以及我们如何塑造 AI 的未来?

报告总结笔记 | Jeff Dean ETH AI趋势 笔记&#xff1a;AI 的重要趋势&#xff1a;我们是如何走到今天的&#xff0c;我们现在能做什么&#xff0c;以及我们如何塑造 AI 的未来&#xff1f; 2025年 4 月 14 日&#xff0c;Google Research 及 Google DeepMind 的首席科学家、A…...

RocketMQ实现基于可靠消息的最终一致性

RocketMQ实现基于可靠消息的最终一致性 文章目录 RocketMQ实现基于可靠消息的最终一致性一、RocketMQ应用场景**应用解耦****流量削峰****数据分发** 二、RocketMQ 基础概念1. 核心组件2. 消费模式3. 消息可靠性 三、消息类型按发送方式分同步发送异步发送单向发送 按使用功能特…...

【题解-Acwing】790. 数的三次方根

题目:790. 数的三次方根 题目描述 给定一个浮点数 n,求它的三次方根。 输入 共一行,包含一个浮点数 n 。 输出 共一行,包含一个浮点数,表示问题的解。 注意,结果保留 6 位小数。 数据范围 −10000 ≤ n ≤ 10000 时空限制 1s / 64MB 输入样例 1000.00输出样…...

一键升级OpenSSH/OpenSSL修复安全漏洞

在服务器安全运维过程中&#xff0c;我们经常面临这样的问题&#xff1a;收到高危漏洞通报&#xff08;如最近的OpenSSH多个CVE漏洞&#xff09;&#xff0c;但Ubuntu系统无法通过apt直接升级到修复版本。这种情况下&#xff0c;传统方法需要手动编译源码&#xff0c;处理依赖关…...

Pycharm 如何删除某个 Python Interpreter

在PyCharm中&#xff0c;点击右下角的“Interpreter Settings”按钮&#xff0c;或者通过菜单栏选择“File” > “Settings”&#xff08;macOS用户选择“PyCharm” > “Preferences”&#xff09;。在设置窗口中&#xff0c;导航到“Project: [Your Project Name]” >…...

【C++】深入浅出之多态

目录 多态的概念多态的定义和实现多态的构造条件虚函数虚函数的重写虚函数重写的两个例外协变析构函数作为虚函数重写 C11的override和final重载、重写(覆盖)、隐藏(重定义)的对比相关面试题⭐ 抽象类概念接口继承和实现继承 多态的原理虚函数表多态的原理动态绑定和静态绑定 e…...

精益数据分析(9/126):如何筛选创业路上的关键数据指标

精益数据分析&#xff08;9/126&#xff09;&#xff1a;如何筛选创业路上的关键数据指标 大家好&#xff01;在创业的漫漫长路中&#xff0c;数据就像一盏明灯&#xff0c;指引着我们前行的方向。但要让这盏灯发挥作用&#xff0c;关键在于找到那些真正有价值的数据指标。今天…...

【Python爬虫详解】第二篇:HTML结构的基本分析

在上一篇文章中&#xff0c;我们介绍了网络爬虫的基本概念、发展历程和工作原理。要进行有效的网页内容爬取&#xff0c;首先需要理解我们要爬取的对象 —— 网页的基本结构和语法。网页本质上是由HTML代码构成的&#xff0c;爬虫程序需要从HTML中提取我们需要的信息。因此&…...

【C++】 —— 笔试刷题day_21

一、爱丽丝的人偶 题目解析 现在存在n个玩偶&#xff0c;每个玩偶的身高是1、2、3......n&#xff1b; 现在我们要对这些玩偶进行排序&#xff08;如果x人偶&#xff0c;它左右两边的玩偶一个比x高、一个比x矮&#xff0c;那这个玩偶就会爆炸&#xff09;。 我们不想要任何一个…...

云点数据读写

一、常见点云数据格式 LAS/LAZ格式 LAS是点云数据的行业标准格式 LAZ是LAS的压缩版本 支持地理参考信息、颜色、强度等属性 PCD格式(Point Cloud Data) PCL(Point Cloud Library)开发的格式 支持ASCII和二进制存储 包含头部信息和数据部分 PLY格式(Polygon File Format…...

Matlab 汽车行驶速度PID控制系统仿真

1、内容简介 Matlab 213-汽车行驶速度PID控制系统仿真 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

STM32嵌入式

一、创建工程项目 1、进入软件首页 2、新建项目,【file】->【new project】 3、选择需要的芯片 4、系统内核部分设置 ① 选择晶振&#xff08;使用外部的高速晶振&#xff09; ② 选择debug形式&#xff08;SW类型&#xff09; 5、时钟设置 6、选择自己需要的引脚设置&a…...

机器学习(神经网络基础篇)——个人理解篇6(概念+代码)

1 在声明一个类中&#xff0c;构建一个属于类的函数&#xff0c;前面为什要加上“self”&#xff1f; 就像下面这一串代码&#xff1a; class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size,weight_init_std0.01):# 初始化权重self.params {}self.p…...

Java学习手册:Filter 和 Listener

在 JavaWeb 开发中&#xff0c;Filter&#xff08;过滤器&#xff09;和 Listener&#xff08;监听器&#xff09;是两个重要的技术组件&#xff0c;它们在处理客户端请求、管理应用状态和资源以及实现全局逻辑控制等方面发挥着关键作用。 一、Filter&#xff08;过滤器&#…...

深度学习总结(25)

抽样偏倚问题 非代表性数据有一个特别隐蔽又特别常见的例子&#xff0c;那就是抽样偏倚&#xff08;sampling bias&#xff09;​。如果你的数据收集过程与你尝试预测的目标之间存在相互影响&#xff0c;就会出现抽样偏倚&#xff0c;从而导致有偏差的结果。 理解数据 将数据…...

探索 Model Context Protocol (MCP):它如何影响 AI 的表现?

Anthropic 公司 Anthropic 是一家技术实力雄厚的公司&#xff0c;也是大模型领域的重要参与者之一。其开发的 **Claude 模型** 是全球首个以编程能力见长并广受欢迎的大语言模型。这款模型凭借卓越的代码生成和理解能力&#xff0c;迅速成为许多开发者工具的核心组件。例如&am…...

Three.js + React 实战系列-3D 个人主页 :完成 Navbar 导航栏组件

在上一节中&#xff0c;我们搭建了项目的基础结构&#xff0c;搭建好了项目框架。 本节我们将继续完善页面结构&#xff0c;完成第一个视觉组件 —— Navbar 导航栏 ✅ 前置准备&#xff1a; ✅下载静态资源在根目录下 (src 同级)谷歌云盘地址 &#x1f3a5; 02 完成 Navba…...

游戏引擎学习第238天:让 OpenGL 使用我们的屏幕坐标

回顾并为今天的内容做准备 我们已经完成了硬件显示的实现&#xff0c;现在通过GPU来显示游戏。原本以为这会花费很长时间&#xff0c;但结果实际所需的时间并不多。因此&#xff0c;我们现在有了进展&#xff0c;但接下来应该做什么还不确定。虽然有很多事情可以做&#xff0c…...

go+mysql+cocos实现游戏搭建

盲目的学了一段时间了&#xff0c;刚开始从Box2d开始学习&#xff0c;明白了很多&#xff0c;Box2d是物理模型的基础&#xff0c;是我们在游戏中模拟现实的很重要的一个开源工具。后来在朋友的建议下学习了cocos&#xff0c;也是小程序开发的利器&#xff0c;而golang是一款高效…...

Linux 网络基础(二) (传输协议层:UDP、TCP)

目录 一、传输层的意义 二、端口号 1、五元组标识一个通信 2、端口号范围划分 3、知名端口号&#xff08;Well-Know Port Number&#xff09; &#xff08;1&#xff09;查看端口号 4、绑定端口号数目问题 5、pidof & netstat 命令 &#xff08;1&#xff09;ne…...

Vue常用指令入门

1. v-for 作用&#xff1a;用于遍历对象或数组 注意&#xff1a;需要提供key属性&#xff0c;可以提高性能和避免渲染错误&#xff0c;值通常为index或item.id <li v-for"(item, index) in items" :key"index">{{ item }} </li>2. v-if,v-el…...

【文献阅读】EndoNet A Deep Architecture for Recognition Tasks on Laparoscopic Videos

关于数据集的整理 Cholec80 胆囊切除手术视频数据集介绍 https://zhuanlan.zhihu.com/p/700024359 数据集信息 Cholec80 数据集 是一个针对内窥镜引导 下的胆囊切除手术视频流程识别数据集。数据集提供了每段视频中总共7种手术动作及总共7种手术工具的标注&#xff0c;标…...

UML统一建模

UML UML&#xff08;统一建模语言&#xff09;介绍 UML&#xff08;统一建模语言&#xff09;介绍 面向对象软件开发需要经过OOA面向对象分析、OOD面向对象设计和OOP面向对象编程三个阶段。OOA对目标系统进行分析并寄哪里分析模型&#xff0c;并将之文档化&#xff0c;OOD用面向…...

Ubuntu下安装和卸载MySQL

Ubuntu下安装和卸载MySQL 下面的演示系统版本&#xff1a;Ubuntu 24.04 更新系统软件包 在开始安装之前&#xff0c;建议先更新系统的软件包列表&#xff0c;以确保所有依赖项是最新的。 sudo apt update && sudo apt upgrade -y安装MySQL服务器 Ubuntu的官方软件…...

物联网技术赋能:复杂环境下的能源数据零丢失

安科瑞顾强 在全球能源挑战日益严峻的背景下&#xff0c;高效节能已成为各行业的核心诉求。无论是商业综合体、工业厂房还是公共设施&#xff0c;如何实现能源的精细化管理成为关键课题。安科瑞能耗云平台凭借其创新技术与多功能服务&#xff0c;为企业提供了一站式能源管理解…...

卷积神经网络综述

摘要 本文对卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;进行了全面综述。首先介绍了卷积神经网络的发展历程&#xff0c;包括早期的理论基础和关键突破。接着详细阐述了卷积神经网络的结构组成&#xff0c;包括卷积层、池化层、全连接层…...

SpringBoot3设置maven package直接打包成二进制可执行文件

注意事项 SpringBoot普通native打包顺序clean compile spring-boot:process-aot native:compile 使用以下配置只会的打包顺序clean package&#xff08;注意&#xff1a;使用此配置以后打包会有编译后的class文件、jar包、original源文件、二进制可执行文件【Linux是无后缀的包…...

在 Anaconda 上安装多版本 Python 解释器并在 PyCharm 中配置

默认已安装好 Anaconda 和 PyCharm &#xff0c;想在 Anaconda 上安装最新版本的 Python 解释器。 一、在 Anaconda 上创建虚拟环境 在连网状态下进入系统的命令提示符&#xff08;快捷键&#xff1a;win r &#xff0c;输入 cmd 即可&#xff09;&#xff0c;输入如下命令&a…...

AES (高级加密标准)

原理详解 AES是一种对称加密算法&#xff0c;使用相同的密钥进行加密和解密。它采用替代-置换网络(SPN)结构&#xff0c;主要步骤包括&#xff1a; 密钥扩展&#xff1a;从初始密钥派生多轮密钥 初始轮&#xff1a;AddRoundKey&#xff08;轮密钥加&#xff09; 主轮&#xff…...

Git拉分支技巧:从零开始创建并推送分支

Git拉分支技巧&#xff1a;从零开始创建并推送分支 在团队协作开发中&#xff0c;Git 分支管理是不可或缺的技能。合理地创建、同步和推送分支&#xff0c;不仅能提高开发效率&#xff0c;还能避免代码冲突。本文将基于以下技巧&#xff0c;详细讲解如何从零开始创建并推送一个…...

线性回归之归一化(normalization)

文章目录 归一化与梯度下降归一化的必要性&#xff1a;从特征量纲到梯度下降问题背景矛盾与低效归一化的作用 归一化提高模型精度的原因归一化的本质常见归一化方法最大值最小值归一化示例说明优缺点分析 标准归一化具体机制示例说明 强调 归一化与梯度下降 归一化与梯度下降 &…...

mac监控linux上mysql性能(Grafana+Prometheus+mysqld_exporter)

一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装&#xff08;mac&#xff09;-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录页面 &#xff08;默认用户名和密码都为admin,进入后…...

【玩泰山派】MISC(杂项)- linux桌面环境

文章目录 linux桌面环境linux四大桌面环境概述ubuntu基于四大桌面环境的版本 显示管理器gdm3&#xff08;GNOME Display Manager&#xff09;lightdm&#xff08;Lightweight Display Manager&#xff09;SDDM&#xff08;Simple Desktop Display Manager&#xff09;KDM&#…...

MVCC介绍

MVCC&#xff08;多版本并发控制&#xff09;详解 MVCC&#xff08;Multi-Version Concurrency Control&#xff09; 是一种数据库并发控制技术&#xff0c;核心思想是通过维护数据的多个版本来实现读写操作的无锁并发&#xff0c;从而在高并发场景下提升性能。它广泛用于 MyS…...

神经网络与模型训练过程笔记

1.专有名词 ANN 人工神经网络&#xff0c;一种受生物神经元启发的监督学习算法。输入数据通过网络中的层级函数传递&#xff0c;激活特定神经元。函数复杂度越高&#xff0c;模型对数据的拟合能力越强&#xff0c;预测精度越高。 偏置项 其中x下表从1开始的是输入变量&#xf…...

ASP.NET 0~1学习

变量 string username Request["id"]; 声明并初始化一个字符串变量 username 数据类型 下面列出了常用的数据类型&#xff1a; 类型描述实例int整数&#xff08;全数字&#xff09;103, 12, 5168float浮点数3.14, 3.4e38decimal十进制数字&#xff08;高精度&a…...

optool为macho文件增加动态库

对macho文件有一定理解后,了解下optool是如何给macho文件增加动态库等功能的 optool 源码 环境 macOS 13.4 (22F66) Xcode 14.3.1 0x0 编译 下载源码 $ git clone --recurse-submodules https://github.com/alexzielenski/optool.git修改下Deployment Target,比如改成11.0&…...

【C++】类和对象之日期类的实现(构造、运算符重载)

文章目录 一、日期类要实现的函数二、函数实现1、GetMonthDay获取对应月份的天数2、CheckDate检查日期3、Date构造函数4、Print打印日期5、运算符重载1. 、、-、-2. 前置/--、后置/--3. 两个日期类相减&#xff08;求相差日期&#xff09; 6、比较7、流插入、流提取&#xff0…...

【Rust 精进之路之第9篇-所有权·核心】规则与移动 (Move):Rust 内存安全基石详解

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:没有 GC,Rust 如何管好内存?答案是所有权! 在我们的 Rust 探索之旅中,我们已经学习了变量、数据类型、控制流、函数和强大的构建工具 Cargo。现在,我们将踏入 Rust 最…...

【任务调度】xxl-job入门

xxl- job 入门 附上笔者写的测视示例&#xff1a;chenmeng-test-demos/demo8-task/task-xxl-job at master cmty256/chenmeng-test-demos 官方文档 XXL-JOB官网 源码仓库地址&#xff1a; Github&#xff1a;https://github.com/xuxueli/xxl-job Gitee&#xff1a;http://g…...

Go语言--语法基础4--基本数据类型--浮点数类型

3 、浮点数类型 浮点型用于表示包含小数点的数据&#xff0c;比如 1.234 就是一个浮点型数据。 Go 语言中的浮点类型采用 IEEE-754 标准的表达方式。 float32 精度是小数点后 7 位 float64 精度是小数点后 15 位。 1. 浮点数表示 Go 语言定义了两个类型 float32 和 floa…...

秘密任务 3.0:如何通过 JWT 认证确保 WebSockets 安全

在之前的文章中&#xff0c;我们探讨了如何通过 WebSockets DTOs 设计实时操作。现在&#xff0c;我们迎来了一项新的挑战&#xff1a;确保 WebSocket 通信在任务执行过程中保持安全。如果敌方潜伏在我们的实时通信渠道中&#xff0c;机密情报可能会被泄露。 任务&#xff1a…...

UID和GID的区别

UID&#xff08;用户标识符&#xff09;和 GID&#xff08;组标识符&#xff09;是 Linux/Unix 系统中用于管理用户和组权限的核心机制&#xff0c;它们的区别主要体现在作用对象和用途上&#xff1a; 目录 1. 定义与作用对象 2. 主要用途 3. 系统保留范围 4. 用户与组的关…...

【网络】通过Samba实现Window挂在Linux服务器路径

有时候我们去进行内网部署时&#xff0c;会遇到客户或者甲方爸爸说&#xff0c;需要将Linux中的某个路径共享出去到Window上&#xff0c;挂载出比如Z:\这种盘符。通过打开Z盘&#xff0c;来查看服务器的指定目录下的数据。 步骤1&#xff1a; 在Linux中安装samba yum install…...

UE5 UI 教程系列全集

https://www.youtube.com/TheRoyalSkies/search?queryUnreal-5%20UI...

论文笔记(七十八)Do generative video models understand physical principles?

Do generative video models understand physical principles? 文章概括Physics-IQ基准数据集评估协议为什么要创建一个真实世界的Physics-IQ数据集模型物理理解的评估指标动作发生在哪里&#xff1f;空间IoU&#xff08;Spatial IoU&#xff09;动作在哪里、何时发生&#xf…...