[mob][photos] Fix issues with face thumbnail (#1523)
## Description See commits.
This commit is contained in:
commit
dad427a498
|
@ -55,6 +55,7 @@ class _FaceWidgetState extends State<FaceWidget> {
|
|||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
final ImageProvider imageProvider = MemoryImage(snapshot.data!);
|
||||
|
||||
return GestureDetector(
|
||||
onTap: () async {
|
||||
if (widget.editMode) return;
|
||||
|
@ -263,32 +264,12 @@ class _FaceWidgetState extends State<FaceWidget> {
|
|||
},
|
||||
child: Column(
|
||||
children: [
|
||||
Container(
|
||||
height: 60,
|
||||
SizedBox(
|
||||
width: 60,
|
||||
decoration: ShapeDecoration(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius:
|
||||
const BorderRadius.all(Radius.elliptical(16, 12)),
|
||||
side: widget.highlight
|
||||
? BorderSide(
|
||||
color: getEnteColorScheme(context).primary700,
|
||||
width: 2.0,
|
||||
)
|
||||
: BorderSide.none,
|
||||
),
|
||||
),
|
||||
child: ClipRRect(
|
||||
borderRadius:
|
||||
const BorderRadius.all(Radius.elliptical(16, 12)),
|
||||
child: SizedBox(
|
||||
width: 60,
|
||||
height: 60,
|
||||
child: CroppedFaceImageView(
|
||||
enteFile: widget.file,
|
||||
face: widget.face,
|
||||
),
|
||||
),
|
||||
height: 60,
|
||||
child: CroppedFaceImageView(
|
||||
enteFile: widget.file,
|
||||
face: widget.face,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
|
|
|
@ -38,7 +38,8 @@ class CroppedFaceImageView extends StatelessWidget {
|
|||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
return LayoutBuilder(
|
||||
builder: (BuildContext context, BoxConstraints constraints) {
|
||||
builder: ((context, constraints) {
|
||||
final double imageAspectRatio = enteFile.width / enteFile.height;
|
||||
final Image image = snapshot.data!;
|
||||
|
||||
final double viewWidth = constraints.maxWidth;
|
||||
|
@ -51,14 +52,13 @@ class CroppedFaceImageView extends StatelessWidget {
|
|||
final double relativeFaceCenterY =
|
||||
faceBox.yMin + faceBox.height / 2;
|
||||
|
||||
const double desiredFaceHeightRelativeToWidget = 7 / 10;
|
||||
const double desiredFaceHeightRelativeToWidget = 8 / 10;
|
||||
final double scale =
|
||||
(1 / faceBox.height) * desiredFaceHeightRelativeToWidget;
|
||||
|
||||
final double widgetCenterX = viewWidth / 2;
|
||||
final double widgetCenterY = viewHeight / 2;
|
||||
|
||||
final double imageAspectRatio = enteFile.width / enteFile.height;
|
||||
final double widgetAspectRatio = viewWidth / viewHeight;
|
||||
final double imageToWidgetRatio =
|
||||
imageAspectRatio / widgetAspectRatio;
|
||||
|
@ -68,16 +68,15 @@ class CroppedFaceImageView extends StatelessWidget {
|
|||
double offsetY =
|
||||
(widgetCenterY - relativeFaceCenterY * viewHeight) * scale;
|
||||
|
||||
if (imageAspectRatio > widgetAspectRatio) {
|
||||
if (imageAspectRatio < widgetAspectRatio) {
|
||||
// Landscape Image: Adjust offsetX more conservatively
|
||||
offsetX = offsetX * imageToWidgetRatio;
|
||||
} else {
|
||||
// Portrait Image: Adjust offsetY more conservatively
|
||||
offsetY = offsetY / imageToWidgetRatio;
|
||||
}
|
||||
|
||||
return ClipRect(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
return ClipRRect(
|
||||
borderRadius: const BorderRadius.all(Radius.elliptical(16, 12)),
|
||||
child: Transform.translate(
|
||||
offset: Offset(
|
||||
offsetX,
|
||||
|
@ -89,7 +88,7 @@ class CroppedFaceImageView extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
}),
|
||||
);
|
||||
} else {
|
||||
if (snapshot.hasError) {
|
||||
|
@ -110,7 +109,7 @@ class CroppedFaceImageView extends StatelessWidget {
|
|||
}
|
||||
|
||||
final imageData = await ioFile.readAsBytes();
|
||||
final image = Image.memory(imageData, fit: BoxFit.cover);
|
||||
final image = Image.memory(imageData, fit: BoxFit.contain);
|
||||
|
||||
return image;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue