pag 1.0.7
pag: ^1.0.7 copied to clipboard
PAG for flutter
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:pag/pag.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
/// use codes below to config cache / multi-thread settings
// PAG.enableCache(false);
// PAG.enableMultiThread(false);
// PAG.setCacheSize(4); ///default size is 8
return MaterialApp(
home: MyHome(),
);
}
}
class MyHome extends StatefulWidget {
@override
_MyHomeState createState() => _MyHomeState();
}
///PAG用于ListView,用于测试加载速度
class _MyListHomeState extends State<MyHome> {
bool visible = false;
@override
Widget build(BuildContext context) {
return Column(
children: [
TextButton(
child: Container(
width: 100,
height: 50,
alignment: Alignment.center,
color: Color.fromARGB(255, 100, 255, 100),
child: Text(
'Test'
),
),
onPressed: (){
setState(() {
visible = !visible;
});
},
),
Expanded(
child: Visibility(
visible: visible,
child: ListView.builder(
itemCount: 300,
// cacheExtent: 3000.0,
itemBuilder: (context, index) {
return Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
PAGView.asset(
'data/${index%20}.pag',
width: (index % 7) * 20 + 10,
height: (index % 7) * 20 + 10,
// 'data/large.pag',
repeatCount: PAGView.REPEAT_COUNT_LOOP,
initProgress: 0.25,
autoPlay: true,
key: ValueKey(index),
),
],
);
}
),
)
),
],
);
}
}
class _MyHomeState extends State<MyHome> {
GlobalKey<PAGViewState> _fansDanceKey = GlobalKey<PAGViewState>(debugLabel: _assetFans);
GlobalKey<PAGViewState> _assetDanceKey = GlobalKey<PAGViewState>(debugLabel: _assetFans);
GlobalKey<PAGViewState> get assetPagKey => _pagAsset == _assetFans ? _fansDanceKey : _assetDanceKey;
final GlobalKey<PAGViewState> networkPagKey = GlobalKey<PAGViewState>();
final GlobalKey<PAGViewState> bytesPagKey = GlobalKey<PAGViewState>();
Uint8List? bytesData;
// 本地加载资源
static const String _assetFans = 'data/fans.pag';
static const String _assetDance = 'data/dance.pag';
static const String _assetError = 'data/error.pag';
String _pagAsset = _assetFans;
void changeAsset() {
setState(() {
_pagAsset = _pagAsset == _assetFans ? _assetDance : _assetFans;
});
}
@override
void initState() {
rootBundle.load("data/fans.pag").then((data) {
setState(() {
bytesData = Uint8List.view(data.buffer);
});
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('PAGView example app'),
),
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
///TODO: PAGView加载本地资源
Padding(
padding: EdgeInsets.only(top: 20, left: 12, bottom: 20),
child: Text(
"PAGView加载本地资源:",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500, color: Colors.black54),
),
),
SizedBox(
width: 100,
height: 100,
child: PAGView.asset(
_pagAsset,
repeatCount: PAGView.REPEAT_COUNT_LOOP,
initProgress: 0.25,
autoPlay: true,
key: assetPagKey,
),
),
Padding(
padding: EdgeInsets.only(left: 12, top: 10),
child: Row(
children: [
IconButton(
iconSize: 30,
icon: const Icon(
Icons.pause_circle,
color: Colors.black54,
),
onPressed: () {
// 暂停
assetPagKey.currentState?.pause();
},
),
IconButton(
iconSize: 30,
icon: const Icon(
Icons.play_circle,
color: Colors.black54,
),
onPressed: () {
//播放
assetPagKey.currentState?.start();
},
),
IconButton(
iconSize: 30,
icon: const Icon(
Icons.published_with_changes_sharp,
color: Colors.black54,
),
onPressed: changeAsset),
Text(
"<= 请点击控制动画(可切换)",
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500, color: Colors.black54),
),
],
),
),
/// TODO: PAGView加载网络资源
Padding(
padding: EdgeInsets.only(top: 50, left: 12, bottom: 20),
child: Text(
"PAGView加载网络资源:",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500, color: Colors.black54),
),
),
PAGView.network(
"https://svipwebwx-30096.sz.gfp.tencent-cloud.com/file1647585475981.pag",
repeatCount: PAGView.REPEAT_COUNT_LOOP,
initProgress: 0.25,
autoPlay: true,
key: networkPagKey,
),
Padding(
padding: EdgeInsets.only(left: 12, top: 10),
child: Row(
children: [
IconButton(
iconSize: 30,
icon: const Icon(
Icons.pause_circle,
color: Colors.black54,
),
onPressed: () {
// 暂停
networkPagKey.currentState?.pause();
},
),
IconButton(
iconSize: 30,
icon: const Icon(
Icons.play_circle,
color: Colors.black54,
),
onPressed: () {
// 播放
networkPagKey.currentState?.start();
},
),
Text(
"<= 请点击控制动画",
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500, color: Colors.black54),
),
],
),
),
/// TODO: PAGView加载二进制资源
Padding(
padding: EdgeInsets.only(top: 50, left: 12, bottom: 20),
child: Text(
"PAGView加载二进制资源:",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500, color: Colors.black54),
),
),
Visibility(
visible: bytesData?.isNotEmpty == true,
child: PAGView.bytes(
bytesData,
repeatCount: PAGView.REPEAT_COUNT_LOOP,
initProgress: 0.25,
autoPlay: true,
key: bytesPagKey,
)),
Padding(
padding: EdgeInsets.only(left: 12, top: 10),
child: Row(
children: [
IconButton(
iconSize: 30,
icon: const Icon(
Icons.pause_circle,
color: Colors.black54,
),
onPressed: () {
// 暂停
bytesPagKey.currentState?.pause();
},
),
IconButton(
iconSize: 30,
icon: const Icon(
Icons.play_circle,
color: Colors.black54,
),
onPressed: () {
// 播放
bytesPagKey.currentState?.start();
},
),
Text(
"<= 请点击控制动画",
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500, color: Colors.black54),
),
],
),
),
/// TODO: PAGView加载二进制资源
Padding(
padding: EdgeInsets.only(top: 20, left: 12, bottom: 20),
child: Text(
"PAGView加载失败的默认占位图:",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500, color: Colors.black54),
),
),
SizedBox(
width: 100,
height: 100,
child: PAGView.asset(
_assetError,
repeatCount: PAGView.REPEAT_COUNT_LOOP,
initProgress: 0.25,
autoPlay: true,
defaultBuilder: (context){
return Container(
color: Colors.grey,
alignment: Alignment.center,
margin: EdgeInsets.all(16),
child: Text("load fail"),
);
},
),
),
],
),
));
}
}