diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 49771c3..3514b57 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -20,20 +20,20 @@
-
+
-
-
+
+
-
+
-
+
@@ -57,13 +57,13 @@
+
-
-
+
@@ -75,8 +75,9 @@
-
+
+
@@ -99,7 +100,6 @@
-
@@ -203,7 +203,7 @@
-
+
@@ -212,12 +212,12 @@
+
-
@@ -229,6 +229,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -280,9 +322,6 @@
-
-
-
@@ -290,9 +329,6 @@
-
-
-
@@ -303,24 +339,24 @@
-
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bd472cb..2d253fd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## [0.0.4] - 2018.09.30
+
+ Modify README description error and format code
+
## [0.0.1] - 2018.09.30
Describe initial release.
diff --git a/README.md b/README.md
index 8047a4a..af3032f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# marquee
+# DragableGridview
[![pub package](https://img.shields.io/pub/v/dragablegridview_flutter.svg)](https://pub.dartlang.org/packages/dragablegridview_flutter)
用GridView编写的可拖动排序View,可任意拖动位置
@@ -16,7 +16,7 @@ MoreWidght:[https://github.com/OpenFlutter/PullToRefresh](https://github.com/O
Add this to your package's pubspec.yaml file:
dependencies:
- dragablegridview_flutter: ^0.0.2
+ dragablegridview_flutter: ^0.0.4
Add it to your dart file:
diff --git a/lib/dragablegridview_flutter.dart b/lib/dragablegridview_flutter.dart
index 00512bc..5465fd1 100644
--- a/lib/dragablegridview_flutter.dart
+++ b/lib/dragablegridview_flutter.dart
@@ -1,4 +1,5 @@
library dragablegridview;
+
import 'dart:async';
import 'package:dragablegridview_flutter/dragablegridviewbin.dart';
@@ -6,8 +7,7 @@ import 'package:flutter/material.dart';
typedef CreateChild = Widget Function(int position);
-class DragAbleGridView extends StatefulWidget{
-
+class DragAbleGridView extends StatefulWidget {
final CreateChild child;
final List itemBins;
final int crossAxisCount;
@@ -19,20 +19,16 @@ class DragAbleGridView extends StatefulWidget{
final EdgeInsets itemPadding;
final Decoration decoration;
-
DragAbleGridView({
@required this.child,
@required this.itemBins,
- this.crossAxisCount:4,
- this.childAspectRatio:1.0,
- this.mainAxisSpacing:0.0,
- this.crossAxisSpacing:0.0,
+ this.crossAxisCount: 4,
+ this.childAspectRatio: 1.0,
+ this.mainAxisSpacing: 0.0,
+ this.crossAxisSpacing: 0.0,
this.itemPadding,
this.decoration,
- }) :assert(
- child!=null,
- itemBins!=null,
- );
+ }) : assert(child != null, itemBins != null,);
@override
State createState() {
@@ -40,9 +36,9 @@ class DragAbleGridView extends StatefulWidget{
}
}
-class DragAbleGridViewState extends State with SingleTickerProviderStateMixin{
-
- var physics=new ScrollPhysics();
+class DragAbleGridViewState
+ extends State with SingleTickerProviderStateMixin {
+ var physics = new ScrollPhysics();
double screenWidth;
double screenHeight;
//在拖动过程中Item position 的位置记录
@@ -65,111 +61,130 @@ class DragAbleGridViewState extends StateendPosition){
- for(int i=endPosition; i endPosition) {
+ for (int i = endPosition; i < startPosition; i++) {
//图标向右 下移动
- if((i+1)%widget.crossAxisCount==0){
- widget.itemBins[itemPositions[i]].lastTimePositionX = -(screenWidth-itemWidth ) * 1+widget.itemBins[itemPositions[i]].lastTimePositionX;
- widget.itemBins[itemPositions[i]].lastTimePositionY = (itemHeight + widget.mainAxisSpacing) * 1+widget.itemBins[itemPositions[i]].lastTimePositionY ;
- }else {
- widget.itemBins[itemPositions[i]].lastTimePositionX = (itemWidth + widget.crossAxisSpacing) * 1+widget.itemBins[itemPositions[i]].lastTimePositionX ;
+ if ((i + 1) % widget.crossAxisCount == 0) {
+ widget.itemBins[itemPositions[i]].lastTimePositionX =
+ -(screenWidth - itemWidth) * 1 +
+ widget.itemBins[itemPositions[i]].lastTimePositionX;
+ widget.itemBins[itemPositions[i]].lastTimePositionY =
+ (itemHeight + widget.mainAxisSpacing) * 1 +
+ widget.itemBins[itemPositions[i]].lastTimePositionY;
+ } else {
+ widget.itemBins[itemPositions[i]].lastTimePositionX =
+ (itemWidth + widget.crossAxisSpacing) * 1 +
+ widget.itemBins[itemPositions[i]].lastTimePositionX;
}
}
- }else{
- for(int i=startPosition+1;i<=endPosition;i++){
+ } else {
+ for (int i = startPosition + 1; i <= endPosition; i++) {
//图标向左 上移动
- if(i%widget.crossAxisCount==0){
- widget.itemBins[itemPositions[i]].lastTimePositionX = (screenWidth-itemWidth ) * 1+widget.itemBins[itemPositions[i]].lastTimePositionX;
- widget.itemBins[itemPositions[i]].lastTimePositionY = -(itemHeight + widget.mainAxisSpacing) * 1+widget.itemBins[itemPositions[i]].lastTimePositionY;
- }else{
- widget.itemBins[itemPositions[i]].lastTimePositionX = -(itemWidth + widget.crossAxisSpacing) * 1+widget.itemBins[itemPositions[i]].lastTimePositionX;
+ if (i % widget.crossAxisCount == 0) {
+ widget.itemBins[itemPositions[i]].lastTimePositionX =
+ (screenWidth - itemWidth) * 1 +
+ widget.itemBins[itemPositions[i]].lastTimePositionX;
+ widget.itemBins[itemPositions[i]].lastTimePositionY =
+ -(itemHeight + widget.mainAxisSpacing) * 1 +
+ widget.itemBins[itemPositions[i]].lastTimePositionY;
+ } else {
+ widget.itemBins[itemPositions[i]].lastTimePositionX =
+ -(itemWidth + widget.crossAxisSpacing) * 1 +
+ widget.itemBins[itemPositions[i]].lastTimePositionX;
}
}
}
return;
}
setState(() {
-
- if(startPosition>endPosition){
- for(int i=endPosition; i endPosition) {
+ for (int i = endPosition; i < startPosition; i++) {
//图标向右 下移动
- if((i+1)%widget.crossAxisCount==0){
- widget.itemBins[itemPositions[i]].dragPointX = -(screenWidth-itemWidth ) * animation.value+widget.itemBins[itemPositions[i]].lastTimePositionX;
- widget.itemBins[itemPositions[i]].dragPointY = (itemHeight + widget.mainAxisSpacing) * animation.value+widget.itemBins[itemPositions[i]].lastTimePositionY ;
- }else {
- widget.itemBins[itemPositions[i]].dragPointX = (itemWidth + widget.crossAxisSpacing) * animation.value+widget.itemBins[itemPositions[i]].lastTimePositionX ;
+ if ((i + 1) % widget.crossAxisCount == 0) {
+ widget.itemBins[itemPositions[i]].dragPointX =
+ -(screenWidth - itemWidth) * animation.value +
+ widget.itemBins[itemPositions[i]].lastTimePositionX;
+ widget.itemBins[itemPositions[i]].dragPointY =
+ (itemHeight + widget.mainAxisSpacing) * animation.value +
+ widget.itemBins[itemPositions[i]].lastTimePositionY;
+ } else {
+ widget.itemBins[itemPositions[i]].dragPointX =
+ (itemWidth + widget.crossAxisSpacing) * animation.value +
+ widget.itemBins[itemPositions[i]].lastTimePositionX;
}
}
- }else{
- for(int i=startPosition+1;i<=endPosition;i++){
+ } else {
+ for (int i = startPosition + 1; i <= endPosition; i++) {
//图标向左 上移动
- if(i%widget.crossAxisCount==0){
- widget.itemBins[itemPositions[i]].dragPointX = (screenWidth-itemWidth ) * animation.value+widget.itemBins[itemPositions[i]].lastTimePositionX;
- widget.itemBins[itemPositions[i]].dragPointY = -(itemHeight + widget.mainAxisSpacing) * animation.value+widget.itemBins[itemPositions[i]].lastTimePositionY;
- }else{
- widget.itemBins[itemPositions[i]].dragPointX = -(itemWidth + widget.crossAxisSpacing) * animation.value+widget.itemBins[itemPositions[i]].lastTimePositionX;
+ if (i % widget.crossAxisCount == 0) {
+ widget.itemBins[itemPositions[i]].dragPointX =
+ (screenWidth - itemWidth) * animation.value +
+ widget.itemBins[itemPositions[i]].lastTimePositionX;
+ widget.itemBins[itemPositions[i]].dragPointY =
+ -(itemHeight + widget.mainAxisSpacing) * animation.value +
+ widget.itemBins[itemPositions[i]].lastTimePositionY;
+ } else {
+ widget.itemBins[itemPositions[i]].dragPointX =
+ -(itemWidth + widget.crossAxisSpacing) * animation.value +
+ widget.itemBins[itemPositions[i]].lastTimePositionX;
}
}
}
});
});
- animation.addStatusListener((animationStatus){
- if(animationStatus==AnimationStatus.completed){
+ animation.addStatusListener((animationStatus) {
+ if (animationStatus == AnimationStatus.completed) {
setState(() {});
- isRest=true;
+ isRest = true;
controller.reset();
- isRest=false;
+ isRest = false;
- int dragPosition=itemPositions[startPosition];
+ int dragPosition = itemPositions[startPosition];
itemPositions.removeAt(startPosition);
itemPositions.insert(endPosition, dragPosition);
- startPosition=endPosition;
-
- }else if(animationStatus==AnimationStatus.forward){
-
- }
+ startPosition = endPosition;
+ } else if (animationStatus == AnimationStatus.forward) {}
});
_initItemPositions();
}
- void _initItemPositions(){
- itemPositions=new List();
- for(int i=0;i extends State extends State0.0) {
- x=-1;
- } else if(dragPointX > 0.0&&updateDetail.delta.dx<0.0){
- x=1;
+ if (dragPointX < 0.0 && updateDetail.delta.dx > 0.0) {
+ x = -1;
+ } else if (dragPointX > 0.0 && updateDetail.delta.dx < 0.0) {
+ x = 1;
}
return x;
}
- int onDragMoreThanWidthX(int index,double xBlankPlace,double dragPointX){
+ int onDragMoreThanWidthX(int index, double xBlankPlace, double dragPointX) {
int x;
if (dragPointX < 0.0) {
- x=(dragPointX+xBlankPlace)~/(itemWidthChild+xBlankPlace);
- x=x-1;
+ x = (dragPointX + xBlankPlace) ~/ (itemWidthChild + xBlankPlace);
+ x = x - 1;
} else {
- x=(dragPointX-xBlankPlace)~/(itemWidthChild+xBlankPlace);
- x=x+1;
+ x = (dragPointX - xBlankPlace) ~/ (itemWidthChild + xBlankPlace);
+ x = x + 1;
}
return x;
}
- int onDragLessThanWidthY(int index,double dragPointY,DragUpdateDetails updateDetail){
- int y=index;
- int a=itemPositions.indexOf(index);
- if(index~/widget.crossAxisCount==a~/widget.crossAxisCount){
+ int onDragLessThanWidthY(
+ int index, double dragPointY, DragUpdateDetails updateDetail) {
+ int y = index;
+ int a = itemPositions.indexOf(index);
+ if (index ~/ widget.crossAxisCount == a ~/ widget.crossAxisCount) {
return index;
}
- if(dragPointY<0.0&&updateDetail.delta.dy>0.0){
- y=index-widget.crossAxisCount;
- }else if(dragPointY>0.0&&updateDetail.delta.dy<0.0){
- y=index+widget.crossAxisCount;
+ if (dragPointY < 0.0 && updateDetail.delta.dy > 0.0) {
+ y = index - widget.crossAxisCount;
+ } else if (dragPointY > 0.0 && updateDetail.delta.dy < 0.0) {
+ y = index + widget.crossAxisCount;
}
return y;
}
- int onDragMoreThanWidthY(int index,double yBlankPlace,double dragPointY){
+ int onDragMoreThanWidthY(int index, double yBlankPlace, double dragPointY) {
int y;
- if(dragPointY<0.0){
- y=index+(dragPointY+yBlankPlace)~/(itemHeightChild+yBlankPlace)*widget.crossAxisCount;
- y=y-widget.crossAxisCount;
- }else{
- y=index+(dragPointY-yBlankPlace)~/(itemHeightChild+yBlankPlace)*widget.crossAxisCount;
- y=y+widget.crossAxisCount;
+ if (dragPointY < 0.0) {
+ y = index +
+ (dragPointY + yBlankPlace) ~/
+ (itemHeightChild + yBlankPlace) *
+ widget.crossAxisCount;
+ y = y - widget.crossAxisCount;
+ } else {
+ y = index +
+ (dragPointY - yBlankPlace) ~/
+ (itemHeightChild + yBlankPlace) *
+ widget.crossAxisCount;
+ y = y + widget.crossAxisCount;
}
return y;
}
+ void onFingerPause(int index, double dragPointX, double dragPointY,
+ DragUpdateDetails updateDetail) async {
+ double xBlankPlace = theMarginsOfParentWid * 2 + widget.crossAxisSpacing;
+ double yBlankPlace = theMarginsOfParentHei * 2 + widget.mainAxisSpacing;
- void onFingerPause(int index,double dragPointX,double dragPointY,DragUpdateDetails updateDetail) async{
- double xBlankPlace=theMarginsOfParentWid*2+widget.crossAxisSpacing;
- double yBlankPlace=theMarginsOfParentHei*2+widget.mainAxisSpacing;
-
- double xMaxCoverageArea=itemWidthChild*(1-areaCoverageRatio)+itemWidthChild;
- double xMinCoverageArea=itemWidthChild*areaCoverageRatio;
- double yMaxCoverageArea=itemHeightChild*(1-areaCoverageRatio)+itemHeightChild;
- double yMinCoverageArea=itemHeightChild*areaCoverageRatio;
+ double xMaxCoverageArea =
+ itemWidthChild * (1 - areaCoverageRatio) + itemWidthChild;
+ double xMinCoverageArea = itemWidthChild * areaCoverageRatio;
+ double yMaxCoverageArea =
+ itemHeightChild * (1 - areaCoverageRatio) + itemHeightChild;
+ double yMinCoverageArea = itemHeightChild * areaCoverageRatio;
////X轴的距离至少被拖动到相邻Item上时
- bool xAtLeastToAdjacentItem=dragPointX.abs()>xBlankPlace;
- bool yAtLeastToAdjacentItem=dragPointY.abs()>yBlankPlace;
+ bool xAtLeastToAdjacentItem = dragPointX.abs() > xBlankPlace;
+ bool yAtLeastToAdjacentItem = dragPointY.abs() > yBlankPlace;
//X轴的拖动距离大于1/3Width 且小于2/3Width
- bool xTransferAbleIfLessThanW=dragPointX.abs()>xMinCoverageArea
- &&dragPointX.abs()yMinCoverageArea
- &&dragPointY.abs() xMinCoverageArea &&
+ dragPointX.abs() < xMaxCoverageArea;
+ bool yTransferAbleIfLessThanH = dragPointY.abs() > yMinCoverageArea &&
+ dragPointY.abs() < yMaxCoverageArea;
//X轴的距离至少被拖动到相邻Item上时,并求得是否在某个Item上
- bool xTransferAbleIfMoreThanW=xAtLeastToAdjacentItem
- &&(dragPointX.abs()-xBlankPlace)%(itemWidthChild+xBlankPlace)>xMinCoverageArea
- &&(dragPointX.abs()-xBlankPlace)%(itemWidthChild+xBlankPlace)yMinCoverageArea
- &&(dragPointY.abs()-yBlankPlace)%(itemHeightChild+yBlankPlace)0){
+ bool xTransferAbleIfMoreThanW = xAtLeastToAdjacentItem &&
+ (dragPointX.abs() - xBlankPlace) % (itemWidthChild + xBlankPlace) >
+ xMinCoverageArea &&
+ (dragPointX.abs() - xBlankPlace) % (itemWidthChild + xBlankPlace) <
+ xMaxCoverageArea;
+ bool yTransferAbleIfMoreThanH = yAtLeastToAdjacentItem &&
+ (dragPointY.abs() - yBlankPlace) % (itemHeightChild + yBlankPlace) >
+ yMinCoverageArea &&
+ (dragPointY.abs() - yBlankPlace) % (itemHeightChild + yBlankPlace) <
+ yMaxCoverageArea;
+
+ if (xTransferAbleIfLessThanW ||
+ yTransferAbleIfLessThanH ||
+ xTransferAbleIfMoreThanW ||
+ yTransferAbleIfMoreThanH) {
+ int y = 0;
+ int x = 0;
+
+ if (yTransferAbleIfLessThanH && yAtLeastToAdjacentItem) {
+ if (dragPointY > 0) {
//item在下侧
- if(updateDetail.delta.dy>0){
+ if (updateDetail.delta.dy > 0) {
//向下滑
- y=onDragMoreThanWidthY(index,yBlankPlace,dragPointY);
- }else{
+ y = onDragMoreThanWidthY(index, yBlankPlace, dragPointY);
+ } else {
//向上滑
- y=onDragLessThanWidthY(index,dragPointY,updateDetail);
+ y = onDragLessThanWidthY(index, dragPointY, updateDetail);
}
- }else{
+ } else {
//item在上侧
- if(updateDetail.delta.dy>0){
+ if (updateDetail.delta.dy > 0) {
//向下滑
- y=onDragLessThanWidthY(index,dragPointY,updateDetail);
- }else{
+ y = onDragLessThanWidthY(index, dragPointY, updateDetail);
+ } else {
//向上滑
- y=onDragMoreThanWidthY(index,yBlankPlace,dragPointY);
+ y = onDragMoreThanWidthY(index, yBlankPlace, dragPointY);
}
}
- }else if(yTransferAbleIfLessThanH){
- y=onDragLessThanWidthY(index,dragPointY,updateDetail);
- }else if(yTransferAbleIfMoreThanH){
- y=onDragMoreThanWidthY(index,yBlankPlace,dragPointY);
- }else if(yAtLeastToAdjacentItem
- &&((dragPointY.abs()-yBlankPlace)%(itemHeightChild+yBlankPlace)yMaxCoverageArea)){
- //TODO 还有一种情况就是 ,X轴可移动,Y轴不可移动(Y轴小于1/5的高度,或大于4/5的高度),但是Y轴有高度,这时要将Y轴的高度算上
- y=onDragMoreThanWidthY(index,yBlankPlace,dragPointY);
- }else{
+ } else if (yTransferAbleIfLessThanH) {
+ y = onDragLessThanWidthY(index, dragPointY, updateDetail);
+ } else if (yTransferAbleIfMoreThanH) {
+ y = onDragMoreThanWidthY(index, yBlankPlace, dragPointY);
+ } else if (yAtLeastToAdjacentItem &&
+ ((dragPointY.abs() - yBlankPlace) % (itemHeightChild + yBlankPlace) <
+ yMinCoverageArea ||
+ (dragPointY.abs() - yBlankPlace) %
+ (itemHeightChild + yBlankPlace) >
+ yMaxCoverageArea)) {
+ // 还有一种情况就是 ,X轴可移动,Y轴不可移动(Y轴小于1/5的高度,或大于4/5的高度),但是Y轴有高度,这时要将Y轴的高度算上
+ y = onDragMoreThanWidthY(index, yBlankPlace, dragPointY);
+ } else {
//要考虑到一种情况,就是只有X轴可移动,Y轴不可移动,这时
- y=index;
+ y = index;
}
-
- if(xTransferAbleIfLessThanW&&xAtLeastToAdjacentItem){
+ if (xTransferAbleIfLessThanW && xAtLeastToAdjacentItem) {
//这里要判断最后一次是滑向哪个方向,先根据dragPointX判断是在左边还是右边,再根据delta.dx判断是左滑还是右滑
- if(dragPointX>0){
+ if (dragPointX > 0) {
//item在右侧
- if(updateDetail.delta.dx>0){
+ if (updateDetail.delta.dx > 0) {
//向右滑
- x=onDragMoreThanWidthX(index,xBlankPlace,dragPointX);
- }else{
+ x = onDragMoreThanWidthX(index, xBlankPlace, dragPointX);
+ } else {
//向左滑
- x=onDragLessThanWidthX(index,dragPointX,yTransferAbleIfLessThanH||yTransferAbleIfMoreThanH,updateDetail);
+ x = onDragLessThanWidthX(
+ index,
+ dragPointX,
+ yTransferAbleIfLessThanH || yTransferAbleIfMoreThanH,
+ updateDetail);
}
- }else{
+ } else {
//item在左侧
- if(updateDetail.delta.dx>0){
+ if (updateDetail.delta.dx > 0) {
//向右滑
- x=onDragLessThanWidthX(index,dragPointX,yTransferAbleIfLessThanH||yTransferAbleIfMoreThanH,updateDetail);
- }else{
+ x = onDragLessThanWidthX(
+ index,
+ dragPointX,
+ yTransferAbleIfLessThanH || yTransferAbleIfMoreThanH,
+ updateDetail);
+ } else {
//向左滑
- x=onDragMoreThanWidthX(index,xBlankPlace,dragPointX);
+ x = onDragMoreThanWidthX(index, xBlankPlace, dragPointX);
}
}
- }else if(xTransferAbleIfLessThanW){
- x=onDragLessThanWidthX(index,dragPointX,yTransferAbleIfLessThanH||yTransferAbleIfMoreThanH,updateDetail);
- }else if(xTransferAbleIfMoreThanW){
- x=onDragMoreThanWidthX(index,xBlankPlace,dragPointX);
- }else if(xAtLeastToAdjacentItem&&
- ((dragPointX.abs()-xBlankPlace)%(itemWidthChild+xBlankPlace)>xMinCoverageArea
- ||(dragPointX.abs()-xBlankPlace)%(itemWidthChild+xBlankPlace)
+ xMinCoverageArea ||
+ (dragPointX.abs() - xBlankPlace) %
+ (itemWidthChild + xBlankPlace) <
+ xMaxCoverageArea)) {
+ // 还有一种情况就是 ,X轴不可移动(X轴小于1/5的宽度,或大于4/5的宽度),Y轴可移动,但是X轴有宽度,这时要将X轴的宽度算上
+ x = onDragMoreThanWidthX(index, xBlankPlace, dragPointX);
}
- if(endPosition!=x+y
- &&!controller.isAnimating
- &&x+y=0
- &&widget.itemBins[index].dragAble){
- endPosition=x+y;
- _future=controller.forward();
+ if (endPosition != x + y &&
+ !controller.isAnimating &&
+ x + y < widget.itemBins.length &&
+ x + y >= 0 &&
+ widget.itemBins[index].dragAble) {
+ endPosition = x + y;
+ _future = controller.forward();
}
}
}
Future _future;
- void onPanEndEvent(index)async {
- widget.itemBins[index].dragAble=false;
- if(controller.isAnimating){
+ void onPanEndEvent(index) async {
+ widget.itemBins[index].dragAble = false;
+ if (controller.isAnimating) {
await _future;
}
setState(() {
List itemBi = new List();
T bin;
for (int i = 0; i < itemPositions.length; i++) {
- bin=widget.itemBins[itemPositions[i]];
+ bin = widget.itemBins[itemPositions[i]];
bin.dragPointX = 0.0;
bin.dragPointY = 0.0;
bin.lastTimePositionX = 0.0;
@@ -454,4 +534,3 @@ class DragAbleGridViewState extends State
homepage: https://github.com/baoolong/DragableGridview