Commit 5bff48f7 authored by wanglei's avatar wanglei

[新增]图片压缩

parent 45e22624
......@@ -26,7 +26,9 @@
android:supportsRtl="true"
android:theme="@style/Theme.AppTheme"
tools:targetApi="31">
<activity
android:name=".ui.photocompression.PhotoCompressionDetailActivity"
android:exported="false" />
<activity
android:name=".ui.splash.SplashActivity"
android:exported="true"
......@@ -83,6 +85,11 @@
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.photocompression.PhotoCompressionActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<provider
android:name="androidx.core.content.FileProvider"
......
{"v":"5.6.3","fr":25,"ip":0,"op":56,"w":600,"h":600,"nm":"图片压缩动画","ddd":0,"assets":[{"id":"image_0","w":72,"h":12,"u":"images/","p":"____593-4669.png","e":0},{"id":"image_1","w":44,"h":77,"u":"images/","p":"___593-4650.png","e":0},{"id":"image_2","w":258,"h":24,"u":"images/","p":"_____593-4663.png","e":0},{"id":"image_3","w":258,"h":30,"u":"images/","p":"_____593-4649.png","e":0},{"id":"image_4","w":108,"h":108,"u":"images/","p":"icon_yasuo_home_593-4664.png","e":0},{"id":"image_5","w":450,"h":450,"u":"images/","p":"_____-__593-4648.png","e":0},{"id":"image_6","w":504,"h":504,"u":"images/","p":"_____-__593-4647.png","e":0}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"小帽子","parent":3,"refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129,-12,0],"ix":2},"a":{"a":0,"k":[36,6,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"弹簧","parent":3,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.45,"y":1},"o":{"x":0.55,"y":0},"t":30,"s":[130.431,-48.53,0],"e":[130.431,-31.53,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.45,"y":0.45},"o":{"x":0.55,"y":0.55},"t":35,"s":[130.431,-31.53,0],"e":[130.431,-31.53,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.45,"y":1},"o":{"x":0.55,"y":0},"t":40,"s":[130.431,-31.53,0],"e":[130.431,-48.53,0],"to":[0,0,0],"ti":[0,0,0]},{"t":45}],"ix":2},"a":{"a":0,"k":[22,38.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.45,0.45,0.45],"y":[1,1,1]},"o":{"x":[0.55,0.55,0.55],"y":[0,0,0]},"t":30,"s":[97.471,97.471,100],"e":[97.471,42.926,100]},{"i":{"x":[0.45,0.45,0.45],"y":[1,1,1]},"o":{"x":[0.55,0.55,0.55],"y":[0,0,0]},"t":35,"s":[97.471,42.926,100],"e":[97.471,42.926,100]},{"i":{"x":[0.45,0.45,0.45],"y":[1,1,1]},"o":{"x":[0.55,0.55,0.55],"y":[0,0,0]},"t":40,"s":[97.471,42.926,100],"e":[97.471,97.471,100]},{"t":45}],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"上压缩盖","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.32,"y":1},"o":{"x":0.68,"y":0},"t":20,"s":[300,246,0],"e":[300,390.09,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":0.3},"o":{"x":0.68,"y":0.68},"t":35,"s":[300,390.09,0],"e":[300,390.09,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.7,"y":0},"t":40,"s":[300,390.09,0],"e":[300,246.09,0],"to":[0,0,0],"ti":[0,0,0]},{"t":55}],"ix":2},"a":{"a":0,"k":[129,12,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"下压缩盖","refId":"image_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,417,0],"ix":2},"a":{"a":0,"k":[129,15,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"icon_yasuo_home","refId":"image_4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[100]},{"t":15}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.35,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[601.689,330,0],"e":[300,330,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.35,"y":0.35},"o":{"x":0.167,"y":0.167},"t":15,"s":[300,330,0],"e":[300,330,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":20,"s":[300,330,0],"e":[300,409.925,0],"to":[0,0,0],"ti":[0,0,0]},{"t":35}],"ix":2},"a":{"a":0,"k":[54,54,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[100,100,100],"e":[20,20,100]},{"t":35}],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":2,"nm":"白色实心圆-小","refId":"image_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2},"a":{"a":0,"k":[225,225,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":2,"nm":"白色边框圆-大","refId":"image_6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20.625,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34.375,"s":[100],"e":[0]},{"t":55}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2},"a":{"a":0,"k":[252,252,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100],"e":[118.254,118.254,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20.625,"s":[118.254,118.254,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":34.375,"s":[100,100,100],"e":[118.254,118.254,100]},{"t":55}],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
{"v":"5.6.3","fr":25,"ip":0,"op":36,"w":870,"h":870,"nm":"1-扫描动画","ddd":0,"assets":[{"id":"image_0","w":120,"h":120,"u":"images/","p":"img_0.png","e":0},{"id":"image_1","w":198,"h":198,"u":"images/","p":"img_1.png","e":0},{"id":"image_2","w":678,"h":678,"u":"images/","p":"img_2.png","e":0},{"id":"image_3","w":678,"h":678,"u":"images/","p":"img_3.png","e":0}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"小飞圆","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[60],"e":[0]},{"t":40}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[141,893,0],"e":[437,429,0],"to":[0,0,0],"ti":[0,0,0]},{"t":35}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"小飞圆","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"小飞圆","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.8],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":5,"s":[60],"e":[0]},{"t":25}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":1},"o":{"x":0.2,"y":0},"t":5,"s":[892,226,0],"e":[462,460,0],"to":[0,0,0],"ti":[0,0,0]},{"t":20}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"小飞圆","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"小飞圆","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.8],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":5,"s":[60],"e":[0]},{"t":25}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":1},"o":{"x":0.2,"y":0},"t":5,"s":[-81,761,0],"e":[431,435,0],"to":[0,0,0],"ti":[0,0,0]},{"t":30}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"小飞圆","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"小飞圆","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.8],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":10,"s":[60],"e":[0]},{"t":30}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":1},"o":{"x":0.2,"y":0},"t":10,"s":[574,-48,0],"e":[434,408,0],"to":[0,0,0],"ti":[0,0,0]},{"t":30}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"小飞圆","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"小飞圆","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.8],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":0,"s":[60],"e":[0]},{"t":20}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":1},"o":{"x":0.2,"y":0},"t":0,"s":[-48,-40,0],"e":[444,444,0],"to":[0,0,0],"ti":[0,0,0]},{"t":18}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[36,36],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"小飞圆","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"小飞圆","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.2],"y":[0]},"t":16,"s":[60],"e":[0]},{"t":36}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":1},"o":{"x":0.2,"y":0},"t":16,"s":[1018,824,0],"e":[446,462,0],"to":[0,0,0],"ti":[0,0,0]},{"t":31}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[26,26],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"小飞圆","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":2,"nm":"icon_clean_home","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[435,435,0],"ix":2},"a":{"a":0,"k":[60,60,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":2,"nm":"小圆","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[435,435,0],"ix":2},"a":{"a":0,"k":[99,99,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":2,"nm":"转圈园","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[360]},{"t":35}],"ix":10},"p":{"a":0,"k":[435,435,0],"ix":2},"a":{"a":0,"k":[339,339,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":2,"nm":"背景圆","refId":"image_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[435,435,0],"ix":2},"a":{"a":0,"k":[339,339,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
......@@ -13,7 +13,9 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.Toast
import androidx.activity.SystemBarStyle
import androidx.activity.addCallback
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultCallback
......@@ -32,6 +34,7 @@ import com.base.appzxhy.R
import com.base.appzxhy.bean.FeatureBean.Companion.BATTERY_INFO
import com.base.appzxhy.bean.FeatureBean.Companion.JUNK_CLEAN
import com.base.appzxhy.bean.FeatureBean.Companion.LARGE_FILE_CLEAN
import com.base.appzxhy.bean.FeatureBean.Companion.PHOTO_COMPRESSION
import com.base.appzxhy.bean.FeatureBean.Companion.SCREENSHOT_CLEAN
import com.base.appzxhy.bean.FeatureBean.Companion.SIMILAR_PHOTOS
import com.base.appzxhy.bean.FileBean
......@@ -43,6 +46,7 @@ import com.base.appzxhy.ui.batteryinfo.BatteryInfoActivity
import com.base.appzxhy.ui.clean.JunkCleanActivity
import com.base.appzxhy.ui.largefile.LargeFileCleanActivity
import com.base.appzxhy.ui.main.MainActivity
import com.base.appzxhy.ui.photocompression.PhotoCompressionActivity
import com.base.appzxhy.ui.screenshot.ScreenshotCleanActivity
import com.base.appzxhy.ui.similar.SimilarPhotosActivity
import com.base.appzxhy.utils.ActivityLauncher
......@@ -112,7 +116,9 @@ abstract class BaseActivity<VB : ViewBinding>(
// }
}
protected open fun initView() {}
protected open fun initView() {
setBackPressed()
}
protected open fun initListener() {}
......@@ -356,8 +362,42 @@ abstract class BaseActivity<VB : ViewBinding>(
})
}
private var isShowAd = false
private fun setBackPressed() {
onBackPressedDispatcher.addCallback {
if (isBackDisable) {
Toast.makeText(
applicationContext,
getString(R.string.wait_a_moment),
Toast.LENGTH_SHORT
).show()
} else {
if (isShowAd) return@addCallback
handleBackPressed()
}
}
}
protected open fun handleBackPressed() {
when (this) {
// is MainActivity -> showLogoutDialog()
// is BatteryInfoActivity -> showExitDialog(ExitConfig.BATTERY_INFO)
// is JunkCleanActivity -> showExitDialog(ExitConfig.JUNK_CLEAN)
// is LargeFileCleanActivity -> showExitDialog(ExitConfig.LARGE_FILE_CLEAN)
// is PhotoCompressionActivity -> showExitDialog(ExitConfig.PHOTO_COMPRESSION)
// is ScreenshotCleanActivity -> showExitDialog(ExitConfig.SCREENSHOT_CLEAN)
// is SimilarPhotosActivity -> showExitDialog(ExitConfig.SIMILAR_PHOTOS)
// is WeatherActivity -> showExitDialog(ExitConfig.WEATHER)
// is ConstellationActivity -> showExitDialog(ExitConfig.CONSTELLATION)
else -> finishToMain()
}
}
}
fun Activity.jumpAction(key: String) {
if (this !is BaseActivity<*>) {
throw Exception("")
......@@ -383,6 +423,9 @@ fun Activity.jumpAction(key: String) {
goToAc(SimilarPhotosActivity::class.java)
}
PHOTO_COMPRESSION -> {
goToAc(PhotoCompressionActivity::class.java)
}
}
}
......@@ -393,8 +436,7 @@ enum class LottieEnum(val data: String, val images: String? = null, val isLoop:
LARGE_FILE_LOTTIE("large_files/scan/data.json", "large_files/scan/images"),
SCREENSHOT_LOTTIE("screenshot/scan/data.json", "screenshot/scan/images"),
SIMILAR_PHOTOS_LOTTIE("similar_photos/scan/data.json", "similar_photos/scan/images"),
// PHOTO_COMPRESSION_LOTTIE("photo_compression/scan/data.json", "photo_compression/scan/images"),
PHOTO_COMPRESSION_LOTTIE("photo_compression/scan/data.json", "photo_compression/scan/images"),
// WHATSAPP("whatsapp/scan/data.json", "whatsapp/scan/images"),
// WEATHER(""),
......
package com.base.appzxhy.ui.photocompression
import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.base.appzxhy.R
import com.base.appzxhy.bean.FileBean
import com.base.appzxhy.databinding.ItemCleanDetailBinding
import com.base.appzxhy.utils.MineTypeUtils.TYPE_AUDIO
import com.base.appzxhy.utils.MineTypeUtils.TYPE_VIDEO
import com.base.appzxhy.utils.Utils
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
class CleanDetailAdapter(
private val type: Int = TYPE_VIDEO,
var list: MutableList<FileBean> = mutableListOf(),
private val block: (item: FileBean) -> Unit
) : RecyclerView.Adapter<CleanDetailAdapter.ViewHolder>() {
@SuppressLint("NotifyDataSetChanged")
fun submitList(data: MutableList<FileBean>) {
list = data
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemCleanDetailBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val context = holder.itemView.context
val item = list[position]
if (type == TYPE_AUDIO) {
holder.binding.clVideoImage.visibility = View.GONE
holder.binding.clAudio.visibility = View.VISIBLE
holder.itemView.layoutParams =
ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
holder.binding.tvAudioName.text = item.name
holder.binding.tvAudioSize.text = Utils.getSizeFormat(item.length)
holder.binding.ivAudioSelect.isSelected = item.isSelected
holder.binding.viewLine.visibility = if (position == itemCount - 1) View.GONE else View.VISIBLE
holder.itemView.setOnClickListener {
item.isSelected = !item.isSelected
notifyItemChanged(position)
block.invoke(item)
}
} else {
holder.binding.clVideoImage.visibility = View.VISIBLE
holder.binding.clAudio.visibility = View.GONE
holder.binding.ivVideo.visibility = if (type == TYPE_VIDEO) View.VISIBLE else View.GONE
holder.itemView.layoutParams =
ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
val width = holder.itemView.context.resources.displayMetrics.widthPixels
val margin = context.resources.getDimensionPixelSize(R.dimen.dp_45)
val imageWidth = (width - margin) / 3
holder.binding.ivImage.layoutParams.width = imageWidth
holder.binding.ivImage.layoutParams.height = imageWidth
val round = context.resources.getDimensionPixelSize(R.dimen.dp_8)
val options = RequestOptions().transform(CenterCrop(), RoundedCorners(round))
Glide.with(holder.itemView.context)
.load(item.path)
.apply(options)
.into(holder.binding.ivImage)
holder.binding.tvSize.text = Utils.getSizeFormat(item.length)
holder.binding.ivVideo.visibility = if (type == 0) View.VISIBLE else View.GONE
holder.binding.ivSelect.isSelected = item.isSelected
holder.itemView.setOnClickListener {
item.isSelected = !item.isSelected
notifyItemChanged(position)
block.invoke(item)
}
}
}
inner class ViewHolder(val binding: ItemCleanDetailBinding) : RecyclerView.ViewHolder(binding.root)
}
\ No newline at end of file
package com.base.appzxhy.ui.photocompression
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.Paint
import android.media.MediaScannerConnection
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import androidx.core.graphics.createBitmap
import androidx.exifinterface.media.ExifInterface
object CompressionUtils {
fun compressSave(context: Context, path: String, mode: Int, complete: (Boolean, Long) -> Unit) {
compressPhoto(path, mode) { size, bitmap ->
if (bitmap != null) {
saveFile(context, path, bitmap, getQuality(mode), complete)
} else {
complete.invoke(false, 0)
}
}
}
fun compressPhoto(path: String, mode: Int, complete: (Long, Bitmap?) -> Unit) {
Thread {
try {
// 读取照片信息和确定缩放比例
val options = BitmapFactory.Options().apply {
inJustDecodeBounds = true
BitmapFactory.decodeFile(path, this)
inSampleSize = calculateInSampleSize(this, 1080, 1920)
inJustDecodeBounds = false
}
// 读取照片数据
val bitmap = BitmapFactory.decodeFile(path, options)
if (bitmap == null) {
complete(0, null)
return@Thread
}
// 旋转照片
val orientation = getOrientation(path)
val rotatedBitmap = rotateBitmap(bitmap, orientation)
// 处理透明背景
val transparentBitmap = handleTransparentBackground(rotatedBitmap)
// 压缩照片
val cacheFile = createTempFile(".jpg")
compressBitmap(transparentBitmap, cacheFile, mode)
complete(cacheFile.length(), BitmapFactory.decodeFile(cacheFile.path))
cacheFile.delete()
} catch (e: IOException) {
complete(0, null)
}
}.start()
}
fun saveFile(context: Context, path: String, bitmap: Bitmap, quality: Int, complete: (Boolean, Long) -> Unit) {
Thread {
val file = File(path)
if (file.exists()) {
file.delete()
}
try {
val outputStream = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream)
outputStream.flush()
outputStream.close()
updateMedia(context, path)
val compressFile = File(path)
complete.invoke(true, compressFile.length())
} catch (e: IOException) {
e.printStackTrace()
complete.invoke(false, 0)
}
}.start()
}
private fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
val width = options.outWidth
val height = options.outHeight
var inSampleSize = 1
while (width / inSampleSize > reqWidth || height / inSampleSize > reqHeight) {
inSampleSize *= 2
}
return inSampleSize
}
private fun rotateBitmap(bitmap: Bitmap, orientation: Int): Bitmap {
val matrix = Matrix()
when (orientation) {
ExifInterface.ORIENTATION_ROTATE_90 -> matrix.postRotate(90f)
ExifInterface.ORIENTATION_ROTATE_180 -> matrix.postRotate(180f)
ExifInterface.ORIENTATION_ROTATE_270 -> matrix.postRotate(270f)
}
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
}
private fun handleTransparentBackground(bitmap: Bitmap): Bitmap {
val newBitmap = createBitmap(bitmap.width, bitmap.height)
val canvas = Canvas(newBitmap)
val paint = Paint().apply { isAntiAlias = true; color = 0xFFFFFFFF.toInt() }
canvas.drawARGB(255, 255, 255, 255)
canvas.drawBitmap(bitmap, 0f, 0f, paint)
return newBitmap
}
private fun compressBitmap(bitmap: Bitmap, file: File, qualityMode: Int) {
val outputStream = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.JPEG, getQuality(qualityMode), outputStream)
outputStream.flush()
outputStream.close()
}
private fun getQuality(mode: Int): Int {
return when (mode) {
1 -> 90
2 -> 85
else -> 98
}
}
private fun getOrientation(filePath: String): Int {
return try {
val exif = ExifInterface(filePath)
exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED)
} catch (e: IOException) {
ExifInterface.ORIENTATION_UNDEFINED
}
}
private fun createTempFile(extension: String): File {
return File.createTempFile(System.currentTimeMillis().toString(), extension)
}
private fun updateMedia(context:Context, filePath: String) {
MediaScannerConnection.scanFile(context, arrayOf(filePath), null, null)
}
}
\ No newline at end of file
package com.base.appzxhy.ui.photocompression
import android.view.View
import android.widget.TextView
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.base.LottieEnum
import com.base.appzxhy.bean.FileBean
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.databinding.ActivityPhotoCompressionBinding
import com.base.appzxhy.utils.MediaUtils
import com.base.appzxhy.utils.MineTypeUtils.TYPE_IMAGE
import com.base.appzxhy.utils.Utils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class PhotoCompressionActivity : BaseActivity<ActivityPhotoCompressionBinding>(ActivityPhotoCompressionBinding::inflate) {
private lateinit var adapter: CleanDetailAdapter
private var total: Long = 0
private var isSelectAll = false
override fun useDefaultImmersive() {
setStatusBarColor()
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, 0, systemBars.right, systemBars.bottom)
binding.clTop.setPadding(0, systemBars.top, 0, 0)
insets
}
}
override fun initView() {
super.initView()
adapter = CleanDetailAdapter(TYPE_IMAGE) {
if (it.isSelected) total += it.length
else total -= it.length
isSelectAll = adapter.list.stream().allMatch(FileBean::isSelected)
updateView(total > 0)
}
binding.rvCompress.adapter = adapter
binding.rvCompress.layoutManager = GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false)
initData()
showAdAnimation(LottieEnum.PHOTO_COMPRESSION_LOTTIE) {
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
}
}
private fun initData() {
lifecycleScope.launch(Dispatchers.IO) {
val images = async { MediaUtils.findImageFiles(this@PhotoCompressionActivity) }.await()
withContext(Dispatchers.Main) {
adapter.submitList(images)
binding.ivEmpty.visibility = if (images.isEmpty()) View.VISIBLE else View.GONE
binding.llBottom.visibility = if (images.isEmpty()) View.GONE else View.VISIBLE
}
}
}
private fun updateView(isSelection: Boolean) {
binding.ivSelectAll.isSelected = isSelectAll
binding.tvCompress.isEnabled = isSelection
setTextSize(binding.tvCompress, getString(R.string.compress), total)
}
fun setTextSize(view: TextView, content: String, total: Long) {
view.text = if (total > 0) "$content (${Utils.getSizeFormat(total)})" else content
}
override fun initListener() {
super.initListener()
binding.ivBack.setOnClickListener { onBackPressedDispatcher.onBackPressed() }
binding.llSelectAll.setOnClickListener {
isSelectAll = !isSelectAll
val list = adapter.list
list.forEach { it.isSelected = isSelectAll }
adapter.submitList(list)
total = list.filter { it.isSelected }.sumOf { it.length }
updateView(isSelectAll)
}
binding.tvCompress.setOnClickListener {
val list = adapter.list.filter { it.isSelected }.toMutableList()
if (list.isEmpty()) return@setOnClickListener
PhotoCompressionDetailActivity.list = list
goToAc(PhotoCompressionDetailActivity::class.java)
}
}
}
\ No newline at end of file
package com.base.appzxhy.ui.photocompression
import android.annotation.SuppressLint
import android.graphics.Color
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.base.LottieEnum
import com.base.appzxhy.bean.FeatureBean.Companion.PHOTO_COMPRESSION
import com.base.appzxhy.bean.FileBean
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.databinding.ActivityPhotoCompressionDetailBinding
import com.base.appzxhy.databinding.ItemPhotoDetailBinding
import com.base.appzxhy.ui.cleanresult.CleanResultActivity
import com.base.appzxhy.ui.dialog.ConfirmDialog
import com.base.appzxhy.ui.photocompression.CompressionUtils.compressSave
import com.base.appzxhy.utils.Utils
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
class PhotoCompressionDetailActivity :
BaseActivity<ActivityPhotoCompressionDetailBinding>(ActivityPhotoCompressionDetailBinding::inflate) {
companion object {
var list = mutableListOf<FileBean>()
}
private lateinit var currentFile: FileBean
private var mode = 1
private var compressTotal: Long = 0
private var selectedPosition = 0
private val adapter by lazy {
class ViewHolder(val binding: ItemPhotoDetailBinding) : RecyclerView.ViewHolder(binding.root)
object : RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemPhotoDetailBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun getItemCount(): Int = list.size
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val context = holder.itemView.context
val item = list[position]
val width = resources.displayMetrics.widthPixels
val viewWidth = width / 3
holder.itemView.layoutParams.width = viewWidth
val bgWidth = context.resources.getDimensionPixelSize(
if (position == selectedPosition) R.dimen.dp_80 else R.dimen.dp_60
)
holder.binding.llPhotoBg.layoutParams.width = bgWidth
holder.binding.llPhotoBg.layoutParams.height = bgWidth
holder.binding.llPhotoBg.setBackgroundResource(if (position == selectedPosition) R.drawable.photo_background else Color.TRANSPARENT)
val round = context.resources.getDimensionPixelSize(R.dimen.dp_8)
val options = RequestOptions().transform(CenterCrop(), RoundedCorners(round))
Glide.with(holder.itemView.context)
.load(item.path)
.apply(options)
.into(holder.binding.ivPhoto)
holder.binding.llPhotoBg.setOnClickListener {
if (selectedPosition == position) return@setOnClickListener
notifyItemChanged(selectedPosition)
selectedPosition = holder.getAdapterPosition()
notifyItemChanged(selectedPosition)
binding.tvCurrentCount.text = "${position + 1}"
currentFile = item
showPhoto()
compress()
}
}
}
}
private fun showPhoto() {
Glide.with(this).load(currentFile.path).into(binding.ivOriginalImage)
binding.tvOriginalSize.text = Utils.getSizeFormat(currentFile.length)
}
private fun compress() {
CompressionUtils.compressPhoto(currentFile.path, mode) { size, bitmap ->
runOnUiThread {
binding.tvCompressSize.text = Utils.getSizeFormat(size)
if (bitmap != null) binding.ivCompressImage.setImageBitmap(bitmap)
}
}
}
override fun useDefaultImmersive() {
setStatusBarColor()
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, 0, systemBars.right, systemBars.bottom)
binding.clTop.setPadding(0, systemBars.top, 0, 0)
insets
}
}
override fun initView() {
super.initView()
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
binding.rvPhoto.adapter = adapter
binding.rvPhoto.layoutManager = GridLayoutManager(this, 1, GridLayoutManager.HORIZONTAL, false)
binding.tvTotalCount.text = "${list.size}"
binding.tvCompressAll.text = getString(if (list.size > 1) R.string.compress_all else R.string.compress)
binding.viewTriple.selection.observe(this) {
mode = it
compress()
}
currentFile = list[0]
}
override fun initListener() {
super.initListener()
binding.ivBack.setOnClickListener { onBackPressedDispatcher.onBackPressed() }
binding.tvCompressAll.setOnClickListener {
val dialog = ConfirmDialog(this)
dialog.action = {
compressSave()
showAdAnimation(LottieEnum.PHOTO_COMPRESSION_LOTTIE) {
CleanResultActivity.functionKey = PHOTO_COMPRESSION
CleanResultActivity.titleName = getString(R.string.photo_compression)
CleanResultActivity.total = list.sumOf { it.length } - compressTotal
goToAc(CleanResultActivity::class.java)
}
}
dialog.showDialog("")
}
}
private fun compressSave() {
list.forEach {
compressSave(this, it.path, mode) { result, size ->
if (result) {
compressTotal += size
}
}
}
}
}
\ No newline at end of file
package com.base.appzxhy.ui.photocompression
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.base.appzxhy.R
import androidx.core.content.withStyledAttributes
class TripleSeekBar @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
style = Paint.Style.FILL
}
private val linePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
style = Paint.Style.STROKE
}
private val selectedLinePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
style = Paint.Style.STROKE
}
private var radius: Float = 0f
private var strokeWidth: Float = 0f
private var defaultColor = 0
private var selectedColor = 0
private var segments = listOf(true, true, false) // 默认第一个圆点选中
private var _selection = MutableLiveData(1)
val selection: LiveData<Int> = _selection
init {
context.withStyledAttributes(attrs, R.styleable.TripleSeekBar) {
defaultColor = getColor(R.styleable.TripleSeekBar_default_color, 0)
selectedColor = getColor(R.styleable.TripleSeekBar_selected_color, 0)
radius = getDimension(R.styleable.TripleSeekBar_width, 0f)
strokeWidth = getDimension(R.styleable.TripleSeekBar_line_height, 0f)
linePaint.strokeWidth = strokeWidth
linePaint.color = defaultColor
selectedLinePaint.strokeWidth = strokeWidth
selectedLinePaint.color = selectedColor
}
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val usableWidth = width - paddingLeft - paddingRight
val segmentWidth = usableWidth / 3
segments.forEachIndexed { index, selected ->
val x = segmentWidth * index + segmentWidth / 2 + paddingLeft
val y = height / 2f
// 绘制线段
if (index < 2) {
val nextX = segmentWidth * (index + 1) + segmentWidth / 2 + paddingLeft
val paint = if (segments[index + 1]) selectedLinePaint else linePaint
canvas.drawLine(x.toFloat(), y, nextX.toFloat(), y, paint)
}
paint.color = if (selected) selectedColor else defaultColor
canvas.drawCircle(x.toFloat(), y, radius, paint)
}
}
override fun onTouchEvent(event: MotionEvent): Boolean {
val usableWidth = width - paddingLeft - paddingRight
val segmentWidth = usableWidth / 3
val x = event.x
val y = event.y
val index = ((x - paddingLeft) / segmentWidth).toInt().coerceIn(0, 2)
when (event.action) {
MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> {
if (event.action == MotionEvent.ACTION_DOWN) {
_selection.value = index
}
segments = List(segments.size) { i -> i <= index }
invalidate()
}
MotionEvent.ACTION_UP -> {
_selection.value = index
}
}
return true
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/colorPrimary" />
<corners android:radius="90dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="8dp" />
<stroke android:width="1dp" android:color="@color/colorPrimary" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:background="@color/color_f7fafa">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
app:layout_constraintTop_toTopOf="parent">
<FrameLayout
android:id="@+id/ll_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingVertical="6dp"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="26dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ivBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_8"
android:padding="@dimen/dp_8"
android:src="@drawable/icon_return_w" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/photo_compression"
android:textColor="@color/white"
android:textSize="20sp"
android:textStyle="bold" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<com.base.appzxhy.business.ads.NativeParentView
android:id="@+id/flAd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="12dp"
app:layout_constraintTop_toBottomOf="@id/cl_top">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/zhanwei1" />
</com.base.appzxhy.business.ads.NativeParentView>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_compress"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:scrollbars="none"
app:layout_constraintBottom_toTopOf="@id/ll_bottom"
app:layout_constraintTop_toBottomOf="@id/flAd" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_empty"
android:layout_width="@dimen/dp_150"
android:layout_height="@dimen/dp_150"
android:layout_marginBottom="100dp"
android:src="@drawable/queshengtu"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/ll_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:gravity="center"
android:orientation="horizontal"
android:padding="16dp"
app:layout_constraintBottom_toBottomOf="parent">
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/ll_select_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_select_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bg_select_yuan" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:text="@string/select_all"
android:textColor="@color/color_666666"
android:textSize="12sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_compress"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:background="@drawable/bg_enable_4"
android:gravity="center"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:text="@string/compress"
android:textColor="@color/white"
android:textSize="14sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<include
android:id="@+id/layout_animation"
layout="@layout/layout_animation"
android:visibility="gone" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_video_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_image"
android:layout_width="110dp"
android:layout_height="110dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:src="@drawable/bg_select_yuan"
app:layout_constraintTop_toTopOf="@id/iv_image"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/iv_image"
app:layout_constraintBottom_toBottomOf="@id/iv_image"
app:layout_constraintStart_toStartOf="@id/iv_image"
app:layout_constraintEnd_toEndOf="@id/iv_image" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_size"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:gravity="center"
android:background="@drawable/shadow_background_bottom"
android:text="12.5MB"
android:textColor="@color/white"
android:textSize="14sp"
app:layout_constraintStart_toStartOf="@id/iv_image"
app:layout_constraintEnd_toEndOf="@id/iv_image"
app:layout_constraintBottom_toBottomOf="@id/iv_image" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_audio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_audio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_audio_junk_nor"
app:layout_constraintTop_toTopOf="@id/ll_audio"
app:layout_constraintBottom_toBottomOf="@id/ll_audio"
app:layout_constraintStart_toStartOf="parent" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/ll_audio"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_audio"
app:layout_constraintEnd_toStartOf="@id/iv_audio_select">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_audio_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:ellipsize="end"
android:text="@string/app_name"
android:textColor="@color/color_181b1f"
android:textSize="16sp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_audio_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:text="@string/app_name"
android:textColor="@color/color_aeb4bd"
android:textSize="12sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_audio_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_weixuanzhong_photo_off"
app:layout_constraintTop_toTopOf="@id/ll_audio"
app:layout_constraintBottom_toBottomOf="@id/ll_audio"
app:layout_constraintEnd_toEndOf="parent" />
<View
android:id="@+id/view_line"
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_marginTop="12dp"
android:background="@color/color_ebebeb"
app:layout_constraintTop_toBottomOf="@id/iv_audio" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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="80dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/ll_photo_bg"
android:layout_width="80dp"
android:layout_height="80dp"
android:padding="2dp"
android:gravity="center"
android:background="@drawable/photo_background"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_photo"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -3,4 +3,12 @@
<declare-styleable name="NativeParentView">
<attr name="removeAll" format="boolean" />
</declare-styleable>
<declare-styleable name="TripleSeekBar">
<attr name="default_color" format="color" />
<attr name="selected_color" format="color" />
<attr name="line_height" format="dimension" />
<attr name="width" format="dimension" />
</declare-styleable>
</resources>
\ No newline at end of file
......@@ -25,4 +25,5 @@
<dimen name="dp_45">45dp</dimen>
<dimen name="sp_18">18sp</dimen>
<dimen name="dp_4">4dp</dimen>
<dimen name="dp_60">60dp</dimen>
</resources>
\ No newline at end of file
......@@ -96,6 +96,10 @@ Please rest assured that we will handle your information in strict accordance wi
<string name="select_all">Select All</string>
<string name="auto_select">Auto Select</string>
<string name="occupies">Occupies</string>
<string name="compress">Compress</string>
<string name="wait_a_moment">Wait a moment</string>
<string name="compress_all">Compress All</string>
<string name="best_quality_photo">Best quality photo</string>
<string name="most_space_saved">Most space saved</string>
</resources>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment