日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

质感设计 android,扣丁学堂Android开发Flutter质感设计之底部导航

發(fā)布時間:2024/1/1 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 质感设计 android,扣丁学堂Android开发Flutter质感设计之底部导航 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

BottomNavigationBar即底部導航欄控件。顯示在應用底部的質感設計控件,用于在少量視圖中切換。底部導航欄包含多個以標簽、圖標或兩者搭配的形式顯示在項目底部的項目,提供了應用程序的頂級視圖之間的快速導航。對于較大的屏幕,側面導航可能更好。

創(chuàng)建navigation_icon_view.dart文件,定義一個NavigationIconView類,用于管理BottomNavigationBarItem(底部導航欄項目)控件的樣式、行為與動畫。

import'package:flutter/material.dart';

//創(chuàng)建類,導航圖標視圖

classNavigationIconView{

//導航圖標視圖的構造函數(shù)

NavigationIconView({

//控件參數(shù),傳遞圖標

Widgeticon,

//控件參數(shù),傳遞標題

Widgettitle,

//控件參數(shù),傳遞顏色

Colorcolor,

/*

*Ticker提供者

*由類實現(xiàn)的接口,可以提供Ticker對象

*Ticker對象:每個動畫幀調用它的回調一次

*/

TickerProvidervsync,

}):_icon=icon,//接收傳遞的圖標

//接收傳遞的顏色

_color=color,

//創(chuàng)建底部導航欄項目

item=newBottomNavigationBarItem(

//項目的圖標

icon:icon,

//項目的標題

title:title

),

//創(chuàng)建動畫控制器

controller=newAnimationController(

//動畫持續(xù)的時間長度:默認情況下主題更改動畫的持續(xù)時間

duration:kThemeAnimationDuration,

//垂直同步

vsync:vsync,

){

//創(chuàng)建曲線動畫

_animation=newCurvedAnimation(

//應用曲線動畫的動畫

parent:controller,

/*

*正向使用的曲線:

*從0.5

*到1.0結束

*應用的曲線:快速啟動并緩和到最終位置的曲線

*/

curve:newInterval(0.5,1.0,curve:Curves.fastOutSlowIn),

);

}

//類成員,存儲圖標

finalWidget_icon;

//類成員,存儲顏色

finalColor_color;

//類成員,底部導航欄項目

finalBottomNavigationBarItemitem;

//類成員,動畫控制器

finalAnimationControllercontroller;

//類成員,曲線動畫

CurvedAnimation_animation;

/*

*類函數(shù),過渡轉換

*BottomNavigationBarType:定義底部導航欄的布局和行為

*BuildContext:處理控件樹中的控件

*/

FadeTransitiontransition(BottomNavigationBarTypetype,BuildContextcontext){

//局部變量,存儲圖標顏色

ColoriconColor;

//如果底部導航欄的位置和大小在點擊時會變大

if(type==BottomNavigationBarType.shifting){

//存儲顏色作為圖標顏色

iconColor=_color;

}else{

/*

*保存質感設計主題的顏色和排版值:

*使用ThemeData來配置主題控件

*使用Theme.of獲取當前主題

*/

finalThemeDatathemeData=Theme.of(context);

/*

*如果程序整體主題的亮度很高(需要深色文本顏色才能實現(xiàn)可讀的對比度)

*就返回程序主要部分的背景顏色作為圖標顏色

*否則返回控件的前景顏色作為圖標顏色

*/

iconColor=themeData.brightness==Brightness.light

?themeData.primaryColor

:themeData.accentColor;

}

//返回值,創(chuàng)建不透明度轉換

returnnewFadeTransition(

//控制子控件不透明度的動畫

opacity:_animation,

//子控件:創(chuàng)建滑動轉換過渡

child:newSlideTransition(

/*

*控制子控件位置的動畫

*開始值和結束值之間的線性插值

*(1.0,0.0)表示Size的右上角

*(0.0,1.0)表示Size的左下角

*/

position:newTween(

//此變量在動畫開頭的值

begin:constFractionalOffset(0.0,0.02),

//此變量在動畫結尾處的值:左上角

end:FractionalOffset.topLeft,

).animate(_animation),//返回給定動畫,該動畫接受由此對象確定的值

//子控件:創(chuàng)建控制子控件的顏色,不透明度和大小的圖標主題

child:newIconTheme(

//用于子控件中圖標的顏色,不透明度和大小

data:newIconThemeData(

//圖標的默認顏色

color:iconColor,

//圖標的默認大小

size:120.0,

),

//子控件

child:_icon,

)

)

);

}

}

再創(chuàng)建main.dart文件。類CustomIcon創(chuàng)建一個容器控件,作為一個自定義的圖標使用。同時使用質感設計的彈出菜單控件切換底部導航欄的行為和樣式。

import'package:flutter/material.dart';

import'navigation_icon_view.dart';

//創(chuàng)建類,自定義圖標,繼承StatelessWidget(無狀態(tài)的控件)

classCustomIconextendsStatelessWidget{

//覆蓋此函數(shù)以構建依賴于動畫的當前狀態(tài)的控件

@override

Widgetbuild(BuildContextcontext){

//獲取當前圖標主題,創(chuàng)建與此圖標主題相同的圖標主題

finalIconThemeDataiconTheme=IconTheme.of(context).fallback();

//返回值,創(chuàng)建一個容器控件

returnnewContainer(

//圍繞子控件的填充:每個邊都偏移4.0

margin:constEdgeInsets.all(4.0),

//容器寬度:圖標主題的寬度減8.0

width:iconTheme.size-8.0,

//容器高度:圖標主題的高度減8.0

height:iconTheme.size-8.0,

//子控件的裝飾:創(chuàng)建一個裝飾

decoration:newBoxDecoration(

//背景顏色:圖標主題的顏色

backgroundColor:iconTheme.color

)

);

}

}

//創(chuàng)建類,菜單演示,繼承StatefulWidget(有狀態(tài)的控件)

classMenusDemoextendsStatefulWidget{

/*

*覆蓋具有相同名稱的超類成員

*createState方法在樹中的給定位置為此控件創(chuàng)建可變狀態(tài)

*子類應重寫此方法以返回其關聯(lián)的State子類新創(chuàng)建的實例

*/

@override

_MenusDemoStatecreateState()=>new_MenusDemoState();

}

/*

*關聯(lián)State子類的實例

*繼承State:StatefulWidget(有狀態(tài)的控件)邏輯和內部狀態(tài)

*繼承TickerProviderStateMixin,提供Ticker對象

*/

class_MenusDemoStateextendsStatewithTickerProviderStateMixin{

//類成員,存儲底部導航欄的當前選擇

int_currentIndex=2;

//類成員,存儲底部導航欄的布局和行為:在點擊時會變大

BottomNavigationBarType_type=BottomNavigationBarType.shifting;

//類成員,存儲NavigationIconView類的列表

List_navigationViews;

/*

*在對象插入到樹中時調用

*框架將為它創(chuàng)建的每個State(狀態(tài))對象調用此方法一次

*覆蓋此方法可以實現(xiàn)此對象被插入到樹中的位置的初始化

*或用于配置此對象上的控件的位置的初始化

*/

@override

voidinitState(){

//調用父類的內容

super.initState();

//在存儲NavigationIconView類的列表里添加內容

_navigationViews=[

/*

*創(chuàng)建NavigationIconView類的實例

*傳遞圖標參數(shù)

*傳遞標題參數(shù)

*傳遞顏色參數(shù)

*傳遞Ticker對象

*/

newNavigationIconView(

icon:newIcon(Icons.access_alarm),

title:newText('成就'),

color:Colors.deepPurple[500],

vsync:this,

),

newNavigationIconView(

icon:newCustomIcon(),

title:newText('行動'),

color:Colors.deepOrange[500],

vsync:this,

),

newNavigationIconView(

icon:newIcon(Icons.cloud),

title:newText('人物'),

color:Colors.teal[500],

vsync:this,

),

newNavigationIconView(

icon:newIcon(Icons.favorite),

title:newText('財產(chǎn)'),

color:Colors.indigo[500],

vsync:this,

),

newNavigationIconView(

icon:newIcon(Icons.event_available),

title:newText('設置'),

color:Colors.pink[500],

vsync:this,

),

];

//循環(huán)調用存儲NavigationIconView類的列表的值

for(NavigationIconViewviewin_navigationViews)

//每次動畫控制器的值更改時調用偵聽器

view.controller.addListener(_rebuild);

//底部導航欄當前選擇的動畫控制器的值為1.0

_navigationViews[_currentIndex].controller.value=1.0;

}

//釋放此對象使用的資源

@override

voiddispose(){

//調用父類的內容

super.dispose();

//循環(huán)調用存儲NavigationIconView類的列表中的項

for(NavigationIconViewviewin_navigationViews)

//調用此方法后,對象不再可用

view.controller.dispose();

}

//動畫控制器的值更改時的操作

void_rebuild(){

//通知框架此對象的內部狀態(tài)已更改

setState((){

//重建,以便為視圖創(chuàng)建動畫

});

}

//建立過渡堆棧

Widget_buildTransitionsStack(){

//局部變量,存儲不透明度轉換的列表

finalListtransitions=[];

//循環(huán)調用存儲NavigationIconView類的列表的值

for(NavigationIconViewviewin_navigationViews)

//在存儲不透明度轉換的列表中添加transition函數(shù)的返回值

transitions.add(view.transition(_type,context));

//對存儲不透明度轉換的列表進行排序

transitions.sort((FadeTransitiona,FadeTransitionb){

finalAnimationaAnimation=a.listenable;

finalAnimationbAnimation=b.listenable;

//aValue:a的動畫值

doubleaValue=aAnimation.value;

//bValue:b的動畫值

doublebValue=bAnimation.value;

/*

*將aValue與bValue進行比較

*返回一個負整數(shù),aValue排序在bValue之前

*返回一個正整數(shù),aValue排序在bValue之后

*/

returnaValue.compareTo(bValue);

});

//返回值,創(chuàng)建層疊布局控件

returnnewStack(children:transitions);

}

//覆蓋此函數(shù)以構建依賴于動畫的當前狀態(tài)的控件

@override

Widgetbuild(BuildContextcontext){

//局部變量,創(chuàng)建底部導航欄

finalBottomNavigationBarbotNavBar=newBottomNavigationBar(

/*

*在底部導航欄中布置的交互項:迭代存儲NavigationIconView類的列表

*返回此迭代的每個元素的底部導航欄項目

*創(chuàng)建包含此迭代的元素的列表

*/

items:_navigationViews

.map((NavigationIconViewnavigationView)=>navigationView.item)

.toList(),

//當前活動項的索引:存儲底部導航欄的當前選擇

currentIndex:_currentIndex,

//底部導航欄的布局和行為:存儲底部導航欄的布局和行為

type:_type,

//當點擊項目時調用的回調

onTap:(intindex){

//通知框架此對象的內部狀態(tài)已更改

setState((){

//當前選擇的底部導航欄項目,開始反向運行此動畫

_navigationViews[_currentIndex].controller.reverse();

//更新存儲底部導航欄的當前選擇

_currentIndex=index;

//當前選擇的底部導航欄項目,開始向前運行此動畫

_navigationViews[_currentIndex].controller.forward();

});

}

);

//實現(xiàn)基本的質感設計視覺布局結構

returnnewScaffold(

//質感設計應用欄

appBar:newAppBar(

//應用欄中顯示的主要控件,包含程序當前內容描述的文本

title:newText('底部導航演示'),

//在標題控件后顯示的控件

actions:[

//創(chuàng)建一個顯示彈出式菜單的按鈕

newPopupMenuButton(

//當用戶從此按鈕創(chuàng)建的彈出菜單中選擇一個值時調用

onSelected:(BottomNavigationBarTypevalue){

//通知框架此對象的內部狀態(tài)已更改

setState((){

//存儲底部導航欄的布局和行為:選擇值

_type=value;

});

},

//點擊彈出菜單中顯示的項目時調用

itemBuilder:(BuildContextcontext)=>>[

/*

*彈出菜單中的顯示項目

*返回值:底部導航欄的布局和行為

*子控件:文本控件

*/

newPopupMenuItem(

value:BottomNavigationBarType.fixed,

child:newText('Fixed')

),

newPopupMenuItem(

value:BottomNavigationBarType.shifting,

child:newText('Shifting')

)

]

)

]

),

//主要內容

body:newCenter(

//主要內容:_buildTransitionsStack函數(shù)的返回值

child:_buildTransitionsStack()

),

//水平的按鈕數(shù)組,沿著程序的底部顯示

bottomNavigationBar:botNavBar,

);

}

}

//程序入口

voidmain(){

//創(chuàng)建質感設計程序,并放置到主屏幕

runApp(newMaterialApp(

//在窗口管理器中使用此應用程序的單行描述

title:'Flutter教程',

//程序的默認路由的控件

home:newMenusDemo(),

));

}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持扣丁學堂。

總結

以上是生活随笔為你收集整理的质感设计 android,扣丁学堂Android开发Flutter质感设计之底部导航的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。