Android補全計劃 DrawerLayout使用

DrawerLayout其實用了很久了,甚至封裝了一些代碼方便不同項目使用,但重構代碼的時候突然意識到這塊內容很不成體系,因此又參考了些文檔,組建了自己的一個文檔。

toolbar+drawerlayout能寫的效果很多,在此我也只是截取了一些從簡單到常用的寫法,其中由于toolbar繼承自viewgroup,所以可以實現很多自己想象中“這樣可以嗎”的效果。

DrawerLayout 是實現了側滑菜單效果的控件,分為側邊菜單和主內容區兩部分:

主內容區要放在側邊菜單前面,還有就是主內容區最好以 DrawerLayout 最好為界面的根布局,否則可能會出現觸摸事件被屏蔽的問題。
側滑菜單部分的布局必須設置 layout_gravity 屬性,表示側滑菜單是在左邊還是右邊,設置了
layout_gravity=“start/left” 的視圖才會被認為是側滑菜單。

使用的注意事項

主內容視圖一定要是 DrawerLayout 的第一個子視圖 主內容視圖寬度和高度需要 match_parent 必須顯示指定側滑視圖的
android:layout_gravity 屬性 android:layout_gravity = “start” 時,從左向右滑出菜單
android:layout_gravity = "end"時,從右向左滑出菜單 不推薦使用left和right!!!
側滑視圖的寬度以dp為單位,不建議超過320dp(為了總能看到一些主內容視圖)
設置側滑事件:mDrawerLayout.setDrawerListener(DrawerLayout.DrawerListene

參考
https://www.jianshu.com/p/082741fede64

1 最簡單的側滑 - 無圖標

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/ly_content"android:layout_width="match_parent"android:layout_height="match_parent" /><ListViewandroid:id="@+id/list_left_drawer"android:layout_width="180dp"android:layout_height="match_parent"android:layout_gravity="start"android:background="#080808"android:choiceMode="singleChoice"android:divider="#FFFFFF"android:dividerHeight="1dp" /></android.support.v4.widget.DrawerLayout>

2 最簡單的側滑+右側圖標側滑

activity_main

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><includeandroid:id="@+id/topbar"layout="@layout/view_topbar"android:layout_width="wrap_content"android:layout_height="48dp" /><FrameLayoutandroid:id="@+id/fly_content"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout><fragmentandroid:id="@+id/fg_left_menu"android:name="jay.com.drawerlayoutdemo2.LeftFragment"android:layout_width="300dp"android:layout_height="match_parent"android:layout_gravity="start"android:tag="LEFT"tools:layout="@layout/fg_left" /><fragmentandroid:id="@+id/fg_right_menu"android:name="jay.com.drawerlayoutdemo2.RightFragment"android:layout_width="100dp"android:layout_height="match_parent"android:layout_gravity="end"android:tag="RIGHT"tools:layout="@layout/fg_right" /></android.support.v4.widget.DrawerLayout>  

view_topbar

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#DCDEDB"><Buttonandroid:id="@+id/btn_right"android:layout_width="40dp"android:layout_height="40dp"android:layout_centerVertical="true"android:layout_alignParentRight="true"android:background="@drawable/btn_selctor"/></RelativeLayout>

上述兩個參考 DrawerLayout(官方側滑菜單)的簡單使用
https://www.runoob.com/w3cnote/android-tutorial-drawerlayout.html

3 左側官方圖標(toolbar)

3.1 側滑菜單在 ToolBar 底部

實現側滑菜單在 ToolBar 底部,需在xml中 ToolBar 放在 DrawerLayout 布局外層。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"app:layout_scrollFlags="scroll|enterAlways"app:title="DrawerLayout"tools:ignore="MissingConstraints" /><androidx.drawerlayout.widget.DrawerLayoutandroid:id="@+id/drawerLayout"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="centerCrop"android:src="@mipmap/meizi_2" /><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="centerCrop"android:src="@mipmap/pangzi" /></androidx.drawerlayout.widget.DrawerLayout>
</LinearLayout>

java中使用ActionBarDrawerToggle定義效果

// 設置左上角圖標["三" —— "←"]效果
ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close);
actionBarDrawerToggle.syncState();
drawerLayout.addDrawerListener(actionBarDrawerToggle);

3.2 側滑菜單和 ToolBar 齊平

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/drawerLayout"android:layout_width="match_parent"android:layout_height="match_parent"><!-- 主內容區 --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- Toolbar 放到 DrawerLayout 里 --><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"app:title="DrawerLayout"app:titleTextColor="@android:color/white" /><!-- 主要內容區域 --><FrameLayoutandroid:id="@+id/contentFrame"android:layout_width="match_parent"android:layout_height="match_parent"><!-- 示例背景圖 --><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="centerCrop"android:src="@mipmap/pangzi" /></FrameLayout></LinearLayout><!-- 側邊欄菜單 --><ListViewandroid:id="@+id/list_left_drawer"android:layout_width="240dp"android:layout_height="match_parent"android:layout_gravity="start"android:background="#111"android:choiceMode="singleChoice"android:divider="#FFFFFF"android:dividerHeight="1dp" /></androidx.drawerlayout.widget.DrawerLayout>

參考
https://juejin.cn/post/6850418119106789384

4 自定義圖標(toolbar)

4.1 xml中Toolbar根節點設置圖標

<android.support.v7.widget.Toolbarapp:navigationIcon="@drawable/ic_add_follow"android:id="@+id/tool_bar"android:layout_width="match_parent"android:layout_height="50dp"android:background="@android:color/holo_green_light"></android.support.v7.widget.Toolbar>
public class TextActivity extends AppCompatActivity {private ActionBarDrawerToggle toggle;private ImageView toolBarIcon;private DrawerLayout mDrawerLayout;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.text_tool_bar);initToolBar();}private void initToolBar() {Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);//不顯示標題toolbar.setTitle(""); setSupportActionBar(toolbar);        //把開關和DrawerLayout關聯toggle = new ActionBarDrawerToggle(this, mDrawerLayout, 0, 0);}//覆寫方法讓系統判斷點擊的圖標后是否彈出側拉頁面@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()){case android.R.id.home:toggle.onOptionsItemSelected(item);}return super.onOptionsItemSelected(item);}

弊端:一:這種方式雖然可以在布局文件中來設置圖標,但是無法給圖標設置選擇器
二:由于是在ToolBar的根節點來設置圖片,所以不能只當圖片擺放的位置
優點:直接在XML中指定圖片,而且一行代碼搞定

4.2 xml中在ToolBar里面來設置子控件來自定義圖標

ToolBar繼承自ViewGroup,完全可以用來盛放控件

<androidx.appcompat.widget.Toolbarandroid:id="@+id/tool_bar"android:layout_width="match_parent"android:layout_height="50dp"  app:contentInsetStart="0.0dp"android:background="@android:color/holo_green_light"><ImageViewandroid:layout_gravity="left"android:id="@+id/tool_bar_icon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_launcher"                                                                                 android:background="@drawable/selector_infodetail_back_bg"/>
</androidx.appcompat.widget.Toolbar>

app:contentInsetStart=“0.0dp” 控制起始位置的內容內邊距,在toolbar想盛放不只是菜單欄時十分重要。
java

public class TextActivity extends AppCompatActivity {private ActionBarDrawerToggle toggle;private DrawerLayout mDrawerLayout;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.text_tool_bar);initToolBar();}private void initToolBar() {//找到圖標的idImageView  toolBarIcon = (ImageView) findViewById(R.id.tool_bar_icon);Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);toolbar.setTitle("");     setSupportActionBar(toolbar);//設置監聽toolBarIcon.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {toggle();}});}}
private void toggle() {int drawerLockMode = mDrawerLayout.getDrawerLockMode(GravityCompat.START);if (mDrawerLayout.isDrawerVisible(GravityCompat.START)&& (drawerLockMode != DrawerLayout.LOCK_MODE_LOCKED_OPEN)) {mDrawerLayout.closeDrawer(GravityCompat.START);} else if (drawerLockMode != DrawerLayout.LOCK_MODE_LOCKED_CLOSED) {mDrawerLayout.openDrawer(GravityCompat.START);}}

通過這種方式設置的圖標就不能通過覆寫onOptionsItemSelected方法的方式來實現側拉頁面的打開和關閉了,因為圖標的id已經不是android.R.id.home,所以只能寫監聽事件來完成側拉頁面的打開和關閉。

通過查看onOptionsItemSelected的源碼發現系統內部實現方式最終調用的是toggle方法,但是這個方法是私有的我們不能通過對象調用到,發現這個方法中只用到了DrawerLayout的對象,所以就直接將這個方法拷貝到自己的類中來使用,完成了這個效果

弊端:XML中代碼比較多
優點:可以給圖標設置狀態選擇器,圖標的擺放位置比較靈活,還可以放其他的控件

4.3 java中設置toolbar圖標(actionbar版本)

actionbar版本

public class TempActivity extends AppCompatActivity {ActionBarDrawerToggle toggle;private DrawerLayout mDrawerLayout;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.text_tool_bar);initToolBar();}private void initToolBar() {Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);//設置圖標toolbar.setNavigationIcon(R.drawable.ic_launcher);// 標題toolbar.setTitle("Title");//把ToolBar的設置的ActionBar的位置setSupportActionBar(toolbar);//獲取開關同時讓開關和DrawerLayout關聯在一起toggle = new ActionBarDrawerToggle(this, mDrawerLayout, 0, 0);getSupportActionBar().setDisplayHomeAsUpEnabled(true);//設置點擊事件,點擊彈出menu界面mDrawerLayout.setDrawerListener(toggle);}//覆寫方法讓系統判斷點擊的圖標后是否彈出側拉頁面@Overridepublic boolean onOptionsItemSelected(MenuItem item) {toggle.onOptionsItemSelected(item);return super.onOptionsItemSelected(item);}
}

這樣就把左側的圖標設置成了我們需要的圖標,同時點擊圖標也可以彈出DrawerLayout的側拉頁面,但是注意:在以上的代碼中少了一行代碼toggle.syncState();作用是將左側小圖標和側拉頁面的狀態同步,只有當去掉這一行代碼的時候,這個方法自定義的圖標才會顯示

弊端:1.使用代碼來放置圖標沒有XML靈活,
2.這種方式不能給圖標是指背景選擇器
上述三種方法參考
https://www.cnblogs.com/zhujiabin/p/7530930.html

4.4 java中設置toolbar圖標(無actionbar)

筆者一般使用這種,個人覺得更靈活一些

Toolbar toolbar = findViewById(R.id.toolbar);
toolbar.setTitle("");
toolbar.setNavigationIcon(R.drawable.menu_ic);DrawerLayout drawerLayout = findViewById(R.id.drawer_layout);
//監聽打開和關閉
toolbar.setNavigationOnClickListener(v -> {if (drawerLayout.isDrawerOpen(GravityCompat.START)) {drawerLayout.closeDrawer(GravityCompat.START);} else {drawerLayout.openDrawer(GravityCompat.START);}
});

5 DrawerLayout + NavigationView + ToolBar 結合使用

仍然是

側滑菜單在 ToolBar 底部
側滑菜單沉浸式覆蓋 ToolBar 展示

第一種效果實際上就是在 XML 布局中,將 ToolBar 布局放到 DrawerLayout 外部,第二種效果是將 ToolBar 放到 DrawerLayout 內部主頁面布局里面,然后實現沉浸式效果。本文源碼中有沉浸式實現的工具類,感興趣的朋友可以下載源碼參考。
下面以沉浸式為例

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/drawerLayout"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"app:layout_scrollFlags="scroll|enterAlways"app:title="DrawerLayout"app:titleTextColor="#FFF"tools:ignore="MissingConstraints" /><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="centerCrop"android:src="@mipmap/meizi_2" /></LinearLayout><com.google.android.material.navigation.NavigationViewandroid:id="@+id/navigationView"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="start"app:headerLayout="@layout/nav_header_main"app:insetForeground="@android:color/transparent"app:menu="@menu/activity_main_drawer" /></androidx.drawerlayout.widget.DrawerLayout>

nav_header_main

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="200dp"android:background="?attr/colorPrimary"android:gravity="bottom"android:theme="@style/ThemeOverlay.AppCompat.Dark"><com.caobo.slideviewdemo.drawerlayout.MovingImageViewandroid:id="@+id/movingImageView"android:layout_width="match_parent"android:layout_height="250dp"android:scaleType="centerCrop"android:src="@mipmap/menu_header_background"app:miv_load_on_create="false"app:miv_max_relative_size="3.0"app:miv_min_relative_offset="0.2"app:miv_repetitions="-1"app:miv_speed="100"app:miv_start_delay="100" /><de.hdodenhof.circleimageview.CircleImageViewandroid:layout_width="100dp"android:layout_height="100dp"android:layout_marginLeft="16dp"android:layout_marginTop="30dp"android:paddingTop="16dp"android:src="@mipmap/header_icon"app:civ_border_color="@color/colorWhite"app:civ_border_width="2dp" /><TextViewandroid:id="@+id/tv_nick"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:layout_marginLeft="16dp"android:layout_marginTop="10dp"android:layout_marginBottom="16dp"android:paddingLeft="5dp"android:text="Learn and live."android:textAppearance="@style/TextAppearance.AppCompat.Body1"android:textSize="18sp" />
</FrameLayout>

activity_main_drawer

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><group android:checkableBehavior="single"><itemandroid:id="@+id/group_item_github"android:icon="@drawable/ic_vector_github_grey"android:title="項目主頁" /><itemandroid:id="@+id/group_item_more"android:icon="@drawable/ic_vector_more"android:title="更多內容" /><itemandroid:id="@+id/group_item_qr_code"android:icon="@drawable/ic_vector_qr_code"android:title="二維碼" /><itemandroid:id="@+id/group_item_share_project"android:icon="@drawable/ic_vector_share"android:title="分享項目" /></group><item android:title="選項"><menu><itemandroid:id="@+id/item_model"android:icon="@drawable/ic_vetor_setting"android:title="夜間模式" /><itemandroid:id="@+id/item_about"android:icon="@drawable/ic_vector_about"android:title="關于" /></menu></item>
</menu>

java代碼
NavigationView 的使用基本上都是 XML 文件中完成的,Activity 中不需要做太多處理,只需要 Activity 中添加 Menu 的監聽。

public class DrawerLayoutActivity extends BaseActivity {@BindView(R.id.toolbar)Toolbar toolbar;@BindView(R.id.drawerLayout)DrawerLayout drawerLayout;@BindView(R.id.navigationView)NavigationView navigationView;MovingImageView movingImageView;private ActionBarDrawerToggle actionBarDrawerToggle;@Overrideprotected void initView() {movingImageView = navigationView.getHeaderView(0).findViewById(R.id.movingImageView);// 設置左上角圖標["三" —— "←"]效果actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close);actionBarDrawerToggle.syncState();drawerLayout.addDrawerListener(actionBarDrawerToggle);// 設置不允許 NavigationMenuView 滾動NavigationMenuView navigationMenuView = (NavigationMenuView) navigationView.getChildAt(0);if (navigationMenuView != null) {navigationMenuView.setVerticalScrollBarEnabled(false);}// NavigationView 監聽navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(@NonNull MenuItem item) {switch (item.getItemId()) {case R.id.group_item_github:Toast.makeText(DrawerLayoutActivity.this,"項目主頁",Toast.LENGTH_SHORT).show();break;case R.id.group_item_more:Toast.makeText(DrawerLayoutActivity.this,"更多內容",Toast.LENGTH_SHORT).show();break;case R.id.group_item_qr_code:Toast.makeText(DrawerLayoutActivity.this,"二維碼",Toast.LENGTH_SHORT).show();break;case R.id.group_item_share_project:Toast.makeText(DrawerLayoutActivity.this,"分享項目",Toast.LENGTH_SHORT).show();break;case R.id.item_model:Toast.makeText(DrawerLayoutActivity.this,"夜間模式",Toast.LENGTH_SHORT).show();break;case R.id.item_about:Toast.makeText(DrawerLayoutActivity.this,"關于",Toast.LENGTH_SHORT).show();break;}item.setCheckable(false);drawerLayout.closeDrawer(GravityCompat.START);return true;}});}@Overrideprotected int getLayoutResID() {return R.layout.activity_drawerlayout;}
}

xml中只需在 DrawerLayout 中添加 NavigationView 控件即可,其中介紹兩個屬性(也就是上圖中紅黃藍三個位置效果):

app:insetForeground="@android:color/transparent" NavigationView 沉浸式展示
app:headerLayout="@layout/nav_header_main" 在 NavigationView 上添加一個 Header 布局
app:menu="@menu/activity_main_drawer" NavigationView 添加標簽 Item 的菜單

上述參考
https://juejin.cn/post/6850418119106789384

結語

//todo
由于當前正在忙業務需求,部分代碼筆者只是粗略過了一下,目測是沒有問題可以使用便參考其作者先放置在了這里,后續會更新自己測試后的代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916260.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916260.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916260.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人工智能之數學基礎:概率論之韋恩圖的應用

韋恩圖的應用由于事件的計算有時候太過于抽象了&#xff0c;此時我們可以使用韋恩圖的方式來進行驗證&#xff0c;我們下面來舉一個例子&#xff0c;A∪B&#xff09;-CA∪(B-C)是否成立&#xff1f;我們可以通過韋恩圖來完成這個任務&#xff1a;我們通過這種方式來一點一點的…

小白成長之路-部署Zabbix7(二)

文章目錄一、zabbix-自動發現二、自動注冊三、zabbix-網易云郵箱-發送消息二、zabbix-釘釘告警總結一、zabbix-自動發現 1.在準備兩臺虛擬機&#xff0c;我的是192.168.144.12,192.168.144.13 server換成zabbix服務器的ip地址 vim /etc/zabbix/zabbix_agentd.conf 2.創建自動…

CMU15445-2024fall-project4踩坑經歷

project4目錄Task1Task2ReconstructSeqScanTask3InsertCommitTxnMgrDbgGenerateNewUndoLog And GenerateUpdateUndoLogUpdate And Delete垃圾回收Task4Index Insert并發控制Index ScanDelete、Update并發控制主鍵更新Bonus 1Bonus 2處理寫傾斜感謝CMU的教授們給我們分享了如此精…

C++20 協程

摘要&#xff1a;C20 引入的協程機制為異步編程提供了輕量級解決方案&#xff0c;其核心優勢在于通過用戶態調度實現高效的上下文切換&#xff0c;適用于 I/O 密集型任務、生成器模式等場景。本文系統闡述 C20 協程的底層原理與實踐要點&#xff0c;首先解析協程的基本結構&…

《計算機組成原理與匯編語言程序設計》實驗報告二 基本數字邏輯及漢字顯示

目 錄 一、實驗學時 二、實驗目的 三、實驗要求 四、實驗內容 五、實驗步驟 1、打開Logisim軟件&#xff0c;列出并行四位二進制全加器邏輯電路真值表&#xff0c;并使用與、或、非、異或等基本原件實現并行四位二進制全加器邏輯電路&#xff0c;鋪設完成后進行測試進而…

問卷調查小程序的設計與實現

問卷調查小程序的設計與實現&#xff1a;技術與功能全解析在數字化時代&#xff0c;問卷調查成為數據收集的重要工具。一款高效、易用的問卷調查小程序能夠顯著提升用戶體驗和數據質量。本文將深入探討基于現代技術棧的問卷調查小程序的設計與實現&#xff0c;涵蓋核心功能、技…

STM32項目實戰:正弦波

波形發生器對我的錢包不怎么友好&#xff0c;手里面有stm32f103c8t6&#xff0c;于是就想,放在哪兒吃灰也是吃灰&#xff0c;不如做個正弦波發生器。方案 dac沒怎么用過&#xff0c;所以打算使用輸出模擬正弦波。我們決定采用以下方案&#xff1a;1.使用TIM2_CH3&#xff08;PA…

Unity 時間抗鋸齒(Temporal Antialiasing, TAA)技術解析

時間抗鋸齒&#xff08;Temporal Antialiasing, TAA&#xff09;技術解析 一、什么是時間抗鋸齒&#xff08;TAA&#xff09;&#xff1f; 時間抗鋸齒&#xff08;TAA&#xff09;是一種先進的實時抗鋸齒技術&#xff0c;通過在時間維度上積累多幀渲染數據&#xff0c;實現比傳…

uniapp打開導航軟件并定位到目標位置的實現

/*** 打開導航* param location 經緯度(例如&#xff1a;"117.214713,39.116884")* param address 地址*/ export function mapNavigation(location, address) {const locationArr location.split(,)const longitude locationArr[0]const latitude locationArr[1]…

Mysql實現高可用(主從、集群)

一、背景 需求&#xff1a;客戶要實現Mysql8.0高可用&#xff0c;出現故障時&#xff0c;需要實現自動切換。 分析&#xff1a;實現切換有兩種方式&#xff0c;一種數據庫自動切換&#xff0c;一種代碼實現。 本著麻煩別人&#xff0c;別麻煩自己的原則&#xff0c;得給客戶的D…

AI編程革命:自動化代碼生成、低代碼開發與智能優化實踐全景解析

AI編程革命&#xff1a;自動化代碼生成、低代碼開發與智能優化實踐全景解析 人工智能正在重塑軟件開發的基本范式&#xff0c;從自動化代碼生成到低代碼開發平臺&#xff0c;再到算法智能優化&#xff0c;AI編程技術正以指數級速度改變開發者工作方式。 一、自動化代碼生成技術…

[實戰] 用1 PPS 馴服本地恒溫晶振(OCXO/TCXO)

1 PPS 馴服本地恒溫晶振&#xff08;OCXO/TCXO&#xff09; “讓任何工程師都能在一周內做出自己的 GPSDO” 文章目錄1 PPS 馴服本地恒溫晶振&#xff08;OCXO/TCXO&#xff09;前言1 系統總體框圖2 硬件清單與連接3 時間間隔測量&#xff08;TDC&#xff09;原理4 數字鎖相環算…

基于RK3576+FPGA的無人機飛控系統解決方案

基于RK3576FPGA的無人機飛控系統解決方案設計如下&#xff1a;一、硬件架構設計?異構計算核心模塊?主控采用RK3576處理器&#xff0c;四核Cortex-A72&#xff08;2.3GHz&#xff09;運行路徑規劃算法&#xff08;A*、RRT*&#xff09;&#xff0c;支持動態避障響應時間<50…

2025暑期—05神經網絡-卷積神經網絡

1. 卷積神經網絡實際上就是避免過擬合&#xff0c;就是“特征”神經網絡。這個特征和卷積核相關。卷積和相關類似&#xff0c;有點是本質屬性和輸出屬性的感覺。著重注意三通道卷積padding 上下左右、前后都要加邊池化就是解決特征過多問題&#xff0c;縮小1倍較多。均值池化&a…

Elasticsearch部署全攻略:編譯安裝與 Yum 安裝實踐,日志切割及報錯處理

前言&#xff1a;在 Linux 運維工作中&#xff0c;Elasticsearch 的部署與運維是高頻需求——無論是快速搭建測試環境還是構建生產級集群&#xff0c;選擇合適的安裝方式&#xff08;編譯安裝或 Yum 安裝&#xff09;直接影響后續維護效率。同時&#xff0c;日志的合理切割能避…

TypeScript 配置參數詳解 (tsconfig.json)

文章目錄前言核心配置基本選項嚴格類型檢查選項模塊解析選項Source Map 選項實驗性選項其他選項文件包含/排除選項詳細用法示例最佳實踐建議前言 tsconfig.json 是 TypeScript 項目的配置文件&#xff0c;用于指定編譯選項和文件包含規則。以下是所有主要配置參數的中文詳解&a…

Java經典筆試題

1.計算機網絡傳輸層有哪些協議&#xff1f;分別適用于什么場景&#xff1f; TCP&#xff1a;面向連接、可靠傳輸&#xff08;重傳機制&#xff09;&#xff0c;適用于對數據完整性要求高的場景&#xff0c;如文件傳輸 &#xff08;FTP&#xff09;、HTTP 通信、郵件發送&…

如何序列化和反序列化動態 XmlElement ?

有如下XML&#xff0c;Index_0-Index_N為動態的&#xff0c;N為可變數&#xff0c;如何將對象NoneXML序列化為XML&#xff0c;以及如何將XML內容反序列化為對象NoneXML&#xff1f;1、XML內容<NoneXML><Index_0><UseInSummary>0</UseInSummary><Beg…

分布式高可用ELK平臺搭建及使用保姆級教程指南 (附安裝包網盤免費下載)

1 ELK 簡介 1.1 ELK 是什么 ? ELK是一套開源免費且功能強大的日志分析管理系統,由 Elasticsearch、Logstash、Kibana 三部分組成,是三個軟件產品的首字母縮寫,簡稱ELK。這三款軟件都是開源軟件,通常是配合使用,且歸于 Elastic.co 公司名下,所以被簡稱為 ELK。 ? ELK…

MySQL索引背后的B+樹奧秘

MySQL 索引實現機制深度解析 MySQL 索引的核心數據結構是 B樹。這種設計是數據庫領域數十年優化的結果&#xff0c;完美平衡了磁盤 I/O 效率、范圍查詢性能和存儲利用率。以下是關鍵要點&#xff1a;一、為什么選擇 B樹而非其他結構&#xff1f;數據結構劣勢B樹優勢二叉搜索樹深…