Merge remote-tracking branch 'gitee/powerbell' into appbase
This commit is contained in:
		| @@ -45,9 +45,9 @@ android { | |||||||
|  |  | ||||||
| dependencies { | dependencies { | ||||||
|     api fileTree(dir: 'libs', include: ['*.jar']) |     api fileTree(dir: 'libs', include: ['*.jar']) | ||||||
|     api 'cc.winboll.studio:libaes:15.6.0' |     api 'cc.winboll.studio:libaes:15.9.3' | ||||||
|     api 'cc.winboll.studio:libapputils:15.3.4' |     api 'cc.winboll.studio:libapputils:15.8.5' | ||||||
|     api 'cc.winboll.studio:libappbase:15.7.6' |     api 'cc.winboll.studio:libappbase:15.9.5' | ||||||
|      |      | ||||||
|     // 吐司提示库 |     // 吐司提示库 | ||||||
|     api 'com.github.getActivity:ToastUtils:10.5' |     api 'com.github.getActivity:ToastUtils:10.5' | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| #Created by .winboll/winboll_app_build.gradle | #Created by .winboll/winboll_app_build.gradle | ||||||
| #Thu May 29 09:43:37 HKT 2025 | #Sun Aug 31 06:21:48 CST 2025 | ||||||
| stageCount=2 | stageCount=12 | ||||||
| libraryProject= | libraryProject= | ||||||
| baseVersion=15.4 | baseVersion=15.4 | ||||||
| publishVersion=15.4.1 | publishVersion=15.4.11 | ||||||
| buildCount=0 | buildCount=0 | ||||||
| baseBetaVersion=15.4.2 | baseBetaVersion=15.4.12 | ||||||
|   | |||||||
| @@ -121,6 +121,8 @@ | |||||||
|  |  | ||||||
|         <activity android:name="cc.winboll.studio.powerbell.activities.AboutActivity"/> |         <activity android:name="cc.winboll.studio.powerbell.activities.AboutActivity"/> | ||||||
|  |  | ||||||
|  |         <activity android:name="cc.winboll.studio.powerbell.activities.PixelPickerActivity"/> | ||||||
|  |  | ||||||
|     </application> |     </application> | ||||||
|  |  | ||||||
| </manifest> | </manifest> | ||||||
| @@ -1,6 +1,7 @@ | |||||||
| package cc.winboll.studio.powerbell; | package cc.winboll.studio.powerbell; | ||||||
|  |  | ||||||
| import android.content.Context; | import android.content.Context; | ||||||
|  | import android.os.Environment; | ||||||
| import android.view.Gravity; | import android.view.Gravity; | ||||||
| import cc.winboll.studio.libappbase.GlobalApplication; | import cc.winboll.studio.libappbase.GlobalApplication; | ||||||
| import cc.winboll.studio.powerbell.receivers.GlobalApplicationReceiver; | import cc.winboll.studio.powerbell.receivers.GlobalApplicationReceiver; | ||||||
| @@ -18,7 +19,7 @@ public class App extends GlobalApplication { | |||||||
|     static AppCacheUtils _mAppCacheUtils; |     static AppCacheUtils _mAppCacheUtils; | ||||||
|     GlobalApplicationReceiver mReceiver; |     GlobalApplicationReceiver mReceiver; | ||||||
|     static String szTempDir = ""; |     static String szTempDir = ""; | ||||||
|      |  | ||||||
|     public static String getTempDirPath() { |     public static String getTempDirPath() { | ||||||
|         return szTempDir; |         return szTempDir; | ||||||
|     } |     } | ||||||
| @@ -26,15 +27,24 @@ public class App extends GlobalApplication { | |||||||
|     @Override |     @Override | ||||||
|     public void onCreate() { |     public void onCreate() { | ||||||
|         super.onCreate(); |         super.onCreate(); | ||||||
|  |  | ||||||
|  |         // 临时文件夹方案1 | ||||||
|  |         // 获取Pictures文件夹路径(Android 10及以上推荐使用MediaStore,此处为传统方式) | ||||||
|  |         File picturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); | ||||||
|  |         // 定义目标文件路径(在Pictures目录下创建"PowerBell"子文件夹及文件) | ||||||
|  |         File powerBellDir = new File(picturesDir, "PowerBell"); | ||||||
|          |          | ||||||
|         // 初始化临时文件夹目录 |         // 临时文件夹方案2 <图片保存失败> | ||||||
|         File fTempDir = new File(getExternalCacheDir(), "TempDir"); |         // 获取Pictures文件夹路径(Android 10及以上推荐使用MediaStore,此处为传统方式) | ||||||
|         if(!fTempDir.exists()) { |         //File powerBellDir = getExternalFilesDir("TempDir"); | ||||||
|             fTempDir.mkdirs(); |  | ||||||
|  |         // 先创建文件夹(如果不存在) | ||||||
|  |         if (!powerBellDir.exists()) { | ||||||
|  |             powerBellDir.mkdirs(); | ||||||
|         } |         } | ||||||
|         szTempDir = fTempDir.getAbsolutePath(); |         szTempDir = powerBellDir.getAbsolutePath(); | ||||||
|          |  | ||||||
|          |  | ||||||
|         // 初始化 Toast 框架 |         // 初始化 Toast 框架 | ||||||
|         ToastUtils.init(this); |         ToastUtils.init(this); | ||||||
|         // 设置 Toast 布局样式 |         // 设置 Toast 布局样式 | ||||||
| @@ -45,7 +55,7 @@ public class App extends GlobalApplication { | |||||||
|         // 设置数据配置存储工具 |         // 设置数据配置存储工具 | ||||||
|         _mAppConfigUtils = getAppConfigUtils(this); |         _mAppConfigUtils = getAppConfigUtils(this); | ||||||
|         _mAppCacheUtils = getAppCacheUtils(this); |         _mAppCacheUtils = getAppCacheUtils(this); | ||||||
|          |  | ||||||
|         mReceiver = new GlobalApplicationReceiver(this); |         mReceiver = new GlobalApplicationReceiver(this); | ||||||
|         mReceiver.registerAction(); |         mReceiver.registerAction(); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -10,23 +10,27 @@ import android.os.Bundle; | |||||||
| import android.provider.MediaStore; | import android.provider.MediaStore; | ||||||
| import android.view.Menu; | import android.view.Menu; | ||||||
| import android.view.MenuItem; | import android.view.MenuItem; | ||||||
|  | import android.widget.RelativeLayout; | ||||||
| import android.widget.Toast; | import android.widget.Toast; | ||||||
| import cc.winboll.studio.libaes.views.AToolbar; | import cc.winboll.studio.libaes.views.AToolbar; | ||||||
| import cc.winboll.studio.libappbase.LogUtils; | import cc.winboll.studio.libappbase.LogUtils; | ||||||
| import cc.winboll.studio.libappbase.LogView; |  | ||||||
| import cc.winboll.studio.powerbell.MainActivity; | import cc.winboll.studio.powerbell.MainActivity; | ||||||
| import cc.winboll.studio.powerbell.activities.AboutActivity; | import cc.winboll.studio.powerbell.activities.AboutActivity; | ||||||
| import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity; | import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity; | ||||||
| import cc.winboll.studio.powerbell.activities.BatteryReporterActivity; | import cc.winboll.studio.powerbell.activities.BatteryReporterActivity; | ||||||
| import cc.winboll.studio.powerbell.activities.ClearRecordActivity; | import cc.winboll.studio.powerbell.activities.ClearRecordActivity; | ||||||
|  | import cc.winboll.studio.powerbell.activities.WinBoLLActivity; | ||||||
|  | import cc.winboll.studio.powerbell.beans.BackgroundPictureBean; | ||||||
| import cc.winboll.studio.powerbell.fragments.MainViewFragment; | import cc.winboll.studio.powerbell.fragments.MainViewFragment; | ||||||
|  | import cc.winboll.studio.powerbell.utils.BackgroundPictureUtils; | ||||||
|  |  | ||||||
|  | public class MainActivity extends WinBoLLActivity { | ||||||
|  |  | ||||||
| public class MainActivity extends Activity { |  | ||||||
|     public static final String TAG = "MainActivity"; |     public static final String TAG = "MainActivity"; | ||||||
|     public static final int BACKGROUND_PICTURE_REQUEST_CODE = 0; |     public static final int BACKGROUND_PICTURE_REQUEST_CODE = 0; | ||||||
|  |  | ||||||
|     public static MainActivity _mMainActivity; |     public static MainActivity _mMainActivity; | ||||||
|     LogView mLogView; |     //LogView mLogView; | ||||||
|     //ArrayList<Fragment> mlistFragment; |     //ArrayList<Fragment> mlistFragment; | ||||||
|     App mApplication; |     App mApplication; | ||||||
|     //AppConfigUtils mAppConfigUtils; |     //AppConfigUtils mAppConfigUtils; | ||||||
| @@ -35,6 +39,16 @@ public class MainActivity extends Activity { | |||||||
|     MainViewFragment mMainViewFragment; |     MainViewFragment mMainViewFragment; | ||||||
|     AToolbar mAToolbar; |     AToolbar mAToolbar; | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public Activity getActivity() { | ||||||
|  |         return this; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public String getTag() { | ||||||
|  |         return TAG; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     protected void onCreate(Bundle savedInstanceState) { |     protected void onCreate(Bundle savedInstanceState) { | ||||||
|         //LogUtils.d(TAG, "onCreate(...)"); |         //LogUtils.d(TAG, "onCreate(...)"); | ||||||
| @@ -42,10 +56,10 @@ public class MainActivity extends Activity { | |||||||
|         setContentView(R.layout.activity_main); |         setContentView(R.layout.activity_main); | ||||||
|  |  | ||||||
|         // 设置调试日志 |         // 设置调试日志 | ||||||
|         mLogView = findViewById(R.id.logview); | //        mLogView = findViewById(R.id.logview); | ||||||
|         mLogView.start(); | //        mLogView.start(); | ||||||
|         //LogUtils.d(TAG, "LogView Start."); | //        //LogUtils.d(TAG, "LogView Start."); | ||||||
|         mLogView.updateLogView(); | //        mLogView.updateLogView(); | ||||||
|  |  | ||||||
|         _mMainActivity = MainActivity.this; |         _mMainActivity = MainActivity.this; | ||||||
|         mApplication = (App) getApplication(); |         mApplication = (App) getApplication(); | ||||||
| @@ -117,8 +131,8 @@ public class MainActivity extends Activity { | |||||||
|         super.onResume(); |         super.onResume(); | ||||||
|         // 回到窗口自动取消提醒消息 |         // 回到窗口自动取消提醒消息 | ||||||
|         //NotificationHelper.cancelRemindNotification(this); |         //NotificationHelper.cancelRemindNotification(this); | ||||||
|  |  | ||||||
|         reloadBackground(); |         reloadBackground(); | ||||||
|  | 		setBackgroundColor(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Menu icons are inflated just as they were with actionbar |     // Menu icons are inflated just as they were with actionbar | ||||||
| @@ -157,6 +171,8 @@ public class MainActivity extends Activity { | |||||||
|             Intent intent = new Intent(); |             Intent intent = new Intent(); | ||||||
|             intent.setClass(this, BackgroundPictureActivity.class); |             intent.setClass(this, BackgroundPictureActivity.class); | ||||||
|             startActivity(intent); |             startActivity(intent); | ||||||
|  |         } else if (menuItemId == R.id.action_log) { | ||||||
|  |             App.getWinBoLLActivityManager().startLogActivity(this); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return true; |         return true; | ||||||
| @@ -193,4 +209,12 @@ public class MainActivity extends Activity { | |||||||
|             moveTaskToBack(true); |             moveTaskToBack(true); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | 	void setBackgroundColor() { | ||||||
|  | 		BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(MainActivity.this); | ||||||
|  | 		BackgroundPictureBean bean = utils.getBackgroundPictureBean(); | ||||||
|  | 		int nPixelColor = bean.getPixelColor(); | ||||||
|  | 		RelativeLayout mainLayout = findViewById(R.id.activitymainRelativeLayout1); | ||||||
|  | 		mainLayout.setBackgroundColor(nPixelColor); | ||||||
|  | 	} | ||||||
| }  | }  | ||||||
|   | |||||||
| @@ -53,11 +53,11 @@ public class AboutActivity extends Activity { | |||||||
|         appInfo.setAppName(getString(R.string.app_name)); |         appInfo.setAppName(getString(R.string.app_name)); | ||||||
|         appInfo.setAppIcon(R.drawable.ic_launcher); |         appInfo.setAppIcon(R.drawable.ic_launcher); | ||||||
|         appInfo.setAppDescription(getString(R.string.app_description)); |         appInfo.setAppDescription(getString(R.string.app_description)); | ||||||
|         appInfo.setAppGitName("APP"); |         appInfo.setAppGitName("APPBase"); | ||||||
|         appInfo.setAppGitOwner("Studio"); |         appInfo.setAppGitOwner("Studio"); | ||||||
|         appInfo.setAppGitAPPBranch(szBranchName); |         appInfo.setAppGitAPPBranch(szBranchName); | ||||||
|         appInfo.setAppGitAPPSubProjectFolder(szBranchName); |         appInfo.setAppGitAPPSubProjectFolder(szBranchName); | ||||||
|         appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=PowerBell"); |         appInfo.setAppHomePage("https://discuz.winboll.cc/forum.php?mod=viewthread&tid=1"); | ||||||
|         appInfo.setAppAPKName("PowerBell"); |         appInfo.setAppAPKName("PowerBell"); | ||||||
|         appInfo.setAppAPKFolderName("PowerBell"); |         appInfo.setAppAPKFolderName("PowerBell"); | ||||||
|         return new AboutView(mContext, appInfo); |         return new AboutView(mContext, appInfo); | ||||||
|   | |||||||
| @@ -1,22 +1,27 @@ | |||||||
| package cc.winboll.studio.powerbell.activities; | package cc.winboll.studio.powerbell.activities; | ||||||
|  |  | ||||||
|  | import android.Manifest; | ||||||
| import android.app.Activity; | import android.app.Activity; | ||||||
| import android.content.Context; | import android.content.Context; | ||||||
| import android.content.Intent; | import android.content.Intent; | ||||||
|  | import android.content.pm.PackageManager; | ||||||
| import android.graphics.Bitmap; | import android.graphics.Bitmap; | ||||||
|  | import android.graphics.BitmapFactory; | ||||||
| import android.graphics.drawable.Drawable; | import android.graphics.drawable.Drawable; | ||||||
| import android.net.Uri; | import android.net.Uri; | ||||||
|  | import android.os.Build; | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
| import android.provider.MediaStore; | import android.provider.MediaStore; | ||||||
| import android.view.View; | import android.view.View; | ||||||
| import android.widget.ImageView; | import android.widget.ImageView; | ||||||
| import android.widget.Toast; | import android.widget.RelativeLayout; | ||||||
|  | import androidx.core.app.ActivityCompat; | ||||||
|  | import androidx.core.content.ContextCompat; | ||||||
| import cc.winboll.studio.libaes.views.AToolbar; | import cc.winboll.studio.libaes.views.AToolbar; | ||||||
| import cc.winboll.studio.libappbase.LogUtils; | import cc.winboll.studio.libappbase.LogUtils; | ||||||
| import cc.winboll.studio.libappbase.utils.ToastUtils; | import cc.winboll.studio.libappbase.utils.ToastUtils; | ||||||
| import cc.winboll.studio.powerbell.App; | import cc.winboll.studio.powerbell.App; | ||||||
| import cc.winboll.studio.powerbell.R; | import cc.winboll.studio.powerbell.R; | ||||||
| import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity; |  | ||||||
| import cc.winboll.studio.powerbell.beans.BackgroundPictureBean; | import cc.winboll.studio.powerbell.beans.BackgroundPictureBean; | ||||||
| import cc.winboll.studio.powerbell.dialogs.BackgroundPicturePreviewDialog; | import cc.winboll.studio.powerbell.dialogs.BackgroundPicturePreviewDialog; | ||||||
| import cc.winboll.studio.powerbell.utils.BackgroundPictureUtils; | import cc.winboll.studio.powerbell.utils.BackgroundPictureUtils; | ||||||
| @@ -24,42 +29,45 @@ import cc.winboll.studio.powerbell.utils.FileUtils; | |||||||
| import cc.winboll.studio.powerbell.utils.UriUtil; | import cc.winboll.studio.powerbell.utils.UriUtil; | ||||||
| import java.io.BufferedOutputStream; | import java.io.BufferedOutputStream; | ||||||
| import java.io.File; | import java.io.File; | ||||||
|  | import java.io.FileNotFoundException; | ||||||
| import java.io.FileOutputStream; | import java.io.FileOutputStream; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.io.OutputStream; | import java.io.OutputStream; | ||||||
|  |  | ||||||
| public class BackgroundPictureActivity extends Activity | public class BackgroundPictureActivity extends WinBoLLActivity implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||||
| implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { |  | ||||||
|  |  | ||||||
|     public static final String TAG = "BackgroundPictureActivity"; |     public static final String TAG = "BackgroundPictureActivity"; | ||||||
|  |  | ||||||
|     public BackgroundPictureUtils mBackgroundPictureUtils; |     public BackgroundPictureUtils mBackgroundPictureUtils; | ||||||
|  |  | ||||||
|     // 图片选择请求 |     // 图片选择请求码 | ||||||
|     public static final int REQUEST_SELECT_PICTURE = 0; |     public static final int REQUEST_SELECT_PICTURE = 0; | ||||||
|     // 照相选择请求 |  | ||||||
|     public static final int REQUEST_TAKE_PHOTO = 1; |     public static final int REQUEST_TAKE_PHOTO = 1; | ||||||
|     // 图片裁剪选择请求 |  | ||||||
|     public static final int REQUEST_CROP_IMAGE = 2; |     public static final int REQUEST_CROP_IMAGE = 2; | ||||||
|  |     private static final int STORAGE_PERMISSION_REQUEST = 100; | ||||||
|  |  | ||||||
|     AToolbar mAToolbar; |     private AToolbar mAToolbar; | ||||||
|     // 所有图片存储的文件夹 |     private File mfBackgroundDir;       // 背景图片存储文件夹 | ||||||
|     File mfBackgroundDir; |     private File mfPictureDir;          // 拍照与剪裁临时文件夹 | ||||||
|     // 拍照与剪裁的文件夹 |     private File mfTakePhoto;           // 拍照文件 | ||||||
|     File mfPictureDir; |     private File mfRecivedPicture;      // 接收的图片文件 | ||||||
|     // 拍照文件类 |     private File mfTempCropPicture;     // 剪裁临时文件 | ||||||
|     File mfTakePhoto; |     private File mfRecivedCropPicture;  // 剪裁后的目标文件 | ||||||
|     // 接收到的图片文件类 |  | ||||||
|     public File mfRecivedPicture; |     // 静态变量 | ||||||
|     // 剪裁文件类 |  | ||||||
|     File mfTempCropPicture; |  | ||||||
|     // 剪裁接收后的文件的文件名 |  | ||||||
|     public static String _mszRecivedCropPicture = "RecivedCrop.jpg"; |     public static String _mszRecivedCropPicture = "RecivedCrop.jpg"; | ||||||
|     File mfRecivedCropPicture; |     private static String _mszCommonFileType = "jpeg"; | ||||||
|     static String _mszCommonFileType = "jpeg"; |     private int mnPictureCompress = 100; | ||||||
|     // 背景图片的压缩比 |     private static String _RecivedPictureFileName; | ||||||
|     int mnPictureCompress = 100; |  | ||||||
|     static String _RecivedPictureFileName; | 	@Override | ||||||
|  | 	public Activity getActivity() { | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	@Override | ||||||
|  | 	public String getTag() { | ||||||
|  | 		return TAG; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     protected void onCreate(Bundle savedInstanceState) { |     protected void onCreate(Bundle savedInstanceState) { | ||||||
| @@ -67,30 +75,29 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | |||||||
|         setContentView(R.layout.activity_backgroundpicture); |         setContentView(R.layout.activity_backgroundpicture); | ||||||
|         initEnv(); |         initEnv(); | ||||||
|  |  | ||||||
|  |         // 初始化工具类和文件夹 | ||||||
|         mBackgroundPictureUtils = BackgroundPictureUtils.getInstance(this); |         mBackgroundPictureUtils = BackgroundPictureUtils.getInstance(this); | ||||||
|         mfBackgroundDir = new File(mBackgroundPictureUtils.getBackgroundDir()); |         mfBackgroundDir = new File(mBackgroundPictureUtils.getBackgroundDir()); | ||||||
|         if (!mfBackgroundDir.exists()) { |         if (!mfBackgroundDir.exists()) { | ||||||
|             mfBackgroundDir.mkdirs(); |             mfBackgroundDir.mkdirs(); | ||||||
|         } |         } | ||||||
|         //mfPictureDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), getString(R.string.app_projectname)); |  | ||||||
|         mfPictureDir = new File(App.getTempDirPath()); |         mfPictureDir = new File(App.getTempDirPath()); | ||||||
|         if (!mfPictureDir.exists()) { |         if (!mfPictureDir.exists()) { | ||||||
|             mfPictureDir.mkdirs(); |             mfPictureDir.mkdirs(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         // 初始化文件对象 | ||||||
|         mfTakePhoto = new File(mfPictureDir, "TakePhoto.jpg"); |         mfTakePhoto = new File(mfPictureDir, "TakePhoto.jpg"); | ||||||
|         mfTempCropPicture = new File(mfPictureDir, "TempCrop.jpg"); |         mfTempCropPicture = new File(mfPictureDir, "TempCrop.jpg"); | ||||||
|  |  | ||||||
|         mfRecivedPicture = getRecivedPictureFile(this); |         mfRecivedPicture = getRecivedPictureFile(this); | ||||||
|         mfRecivedCropPicture = new File(mfBackgroundDir, _mszRecivedCropPicture); |         mfRecivedCropPicture = new File(mfBackgroundDir, _mszRecivedCropPicture); | ||||||
|  |  | ||||||
|         // 初始化工具栏 |         // 初始化工具栏 | ||||||
|         mAToolbar = (AToolbar) findViewById(R.id.toolbar); |         mAToolbar = (AToolbar) findViewById(R.id.toolbar); | ||||||
|         setActionBar(mAToolbar); |         setActionBar(mAToolbar); | ||||||
|         //mAToolbar.setTitle(getTitle() + "-" + getString(R.string.subtitle_activity_backgroundpicture)); |  | ||||||
|         mAToolbar.setSubtitle(R.string.subtitle_activity_backgroundpicture); |         mAToolbar.setSubtitle(R.string.subtitle_activity_backgroundpicture); | ||||||
|         //mAToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText); |  | ||||||
|         //mAToolbar.setSubtitleTextAppearance(this, R.style.Toolbar_SubTitleText); |  | ||||||
|         //mAToolbar.setBackgroundColor(getColor(R.color.colorPrimary)); |  | ||||||
|         setActionBar(mAToolbar); |  | ||||||
|         getActionBar().setDisplayHomeAsUpEnabled(true); |         getActionBar().setDisplayHomeAsUpEnabled(true); | ||||||
|         mAToolbar.setNavigationOnClickListener(new View.OnClickListener() { |         mAToolbar.setNavigationOnClickListener(new View.OnClickListener() { | ||||||
|                 @Override |                 @Override | ||||||
| @@ -99,41 +106,30 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | |||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|         //给按钮设置点击事件 |         // 设置按钮点击事件 | ||||||
|         findViewById(R.id.activitybackgroundpictureAButton5).setOnClickListener(onOriginNullClickListener); |         findViewById(R.id.activitybackgroundpictureAButton5).setOnClickListener(onOriginNullClickListener); | ||||||
|         findViewById(R.id.activitybackgroundpictureAButton4).setOnClickListener(onReceivedPictureClickListener); |         findViewById(R.id.activitybackgroundpictureAButton4).setOnClickListener(onReceivedPictureClickListener); | ||||||
|         findViewById(R.id.activitybackgroundpictureAButton1).setOnClickListener(onTakePhotoClickListener); |         findViewById(R.id.activitybackgroundpictureAButton1).setOnClickListener(onTakePhotoClickListener); | ||||||
|         findViewById(R.id.activitybackgroundpictureAButton2).setOnClickListener(onSelectPictureClickListener); |         findViewById(R.id.activitybackgroundpictureAButton2).setOnClickListener(onSelectPictureClickListener); | ||||||
|         findViewById(R.id.activitybackgroundpictureAButton3).setOnClickListener(onCropPictureClickListener); |         findViewById(R.id.activitybackgroundpictureAButton3).setOnClickListener(onCropPictureClickListener); | ||||||
|         findViewById(R.id.activitybackgroundpictureAButton6).setOnClickListener(onCropFreePictureClickListener); |         findViewById(R.id.activitybackgroundpictureAButton6).setOnClickListener(onCropFreePictureClickListener); | ||||||
|  | 		findViewById(R.id.activitybackgroundpictureAButton7).setOnClickListener(onPixelPickerClickListener); | ||||||
|  | 		findViewById(R.id.activitybackgroundpictureAButton8).setOnClickListener(onCleanPixelClickListener); | ||||||
|  |  | ||||||
|         updatePreviewBackground(); |         updatePreviewBackground(); | ||||||
|  |  | ||||||
|  |         // 处理分享的图片 | ||||||
|  |  | ||||||
|         // 判断并且处理应用分享到的文件 |  | ||||||
|         // |  | ||||||
|         //ToastUtils.show("Activity Opened."); |  | ||||||
|  |  | ||||||
|         // 预备接收参数 |  | ||||||
|         Intent intent = getIntent(); |         Intent intent = getIntent(); | ||||||
|         String action = intent.getAction(); |         String action = intent.getAction(); | ||||||
|         String type = intent.getType(); |         String type = intent.getType(); | ||||||
|  |  | ||||||
|         //LogUtils.d(TAG, "action : " + action); |         if (Intent.ACTION_SEND.equals(action) && type != null && isImageType(type)) { | ||||||
|         //LogUtils.d(TAG, "type : " + type); |             BackgroundPicturePreviewDialog dlg = new BackgroundPicturePreviewDialog(this); | ||||||
|  |  | ||||||
|         // 判断是否进入图片分享状态 |  | ||||||
|         if (Intent.ACTION_SEND.equals(action) |  | ||||||
|             && type != null |  | ||||||
|             && ("image/*".equals(type) || "image/jpeg".equals(type) || "image/jpg".equals(type) || "image/png".equals(type) || "image/webp".equals(type))) { |  | ||||||
|             // 预览图片 |  | ||||||
|             BackgroundPicturePreviewDialog dlg= new BackgroundPicturePreviewDialog(this); |  | ||||||
|             dlg.show(); |             dlg.show(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void initEnv() { |     private void initEnv() { | ||||||
|         LogUtils.d(TAG, "initEnv()"); |         LogUtils.d(TAG, "initEnv()"); | ||||||
|         _RecivedPictureFileName = "Recived.data"; |         _RecivedPictureFileName = "Recived.data"; | ||||||
|     } |     } | ||||||
| @@ -144,47 +140,55 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void onAcceptRecivedPicture(String szPreRecivedPictureName) { |     public void onAcceptRecivedPicture(String szPreRecivedPictureName) { | ||||||
|         //ToastUtils.show("onAcceptRecivedPicture"); |  | ||||||
|         BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(this); |         BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(this); | ||||||
|         utils.getBackgroundPictureBean().setIsUseBackgroundFile(true); |         utils.getBackgroundPictureBean().setIsUseBackgroundFile(true); | ||||||
|         utils.saveData(); |         utils.saveData(); | ||||||
|         File fPreRecivedPictureName = new File(utils.getBackgroundDir(), szPreRecivedPictureName); |  | ||||||
|         FileUtils.copyFile(fPreRecivedPictureName, mfRecivedPicture); |  | ||||||
|         // 加载背景 |  | ||||||
|         startCropImageActivity(false); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // |         File sourceFile = new File(utils.getBackgroundDir(), szPreRecivedPictureName); | ||||||
|     // 更新预览背景 |         if (FileUtils.copyFile(sourceFile, mfRecivedPicture)) { | ||||||
|     // |             startCropImageActivity(false); | ||||||
|     public void updatePreviewBackground() { |  | ||||||
|         LogUtils.d(TAG, "updatePreviewBackground"); |  | ||||||
|         ImageView ivPreviewBackground = findViewById(R.id.activitybackgroundpictureImageView1); |  | ||||||
|         BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(this); |  | ||||||
|         utils.loadBackgroundPictureBean(); |  | ||||||
|         boolean isUseBackgroundFile = utils.getBackgroundPictureBean().isUseBackgroundFile(); |  | ||||||
|         if (isUseBackgroundFile && mfRecivedCropPicture.exists()) { |  | ||||||
|             try { |  | ||||||
|                 String szBackgroundFilePath = utils.getBackgroundDir() + getBackgroundFileName(); |  | ||||||
|                 Drawable drawableBackground = FileUtils.getImageDrawable(szBackgroundFilePath); |  | ||||||
|                 drawableBackground.setAlpha(120); |  | ||||||
|                 ivPreviewBackground.setImageDrawable(drawableBackground); |  | ||||||
|                 ToastUtils.show("Use acceptRecived background."); |  | ||||||
|             } catch (IOException e) { |  | ||||||
|                 LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); |  | ||||||
|             } |  | ||||||
|         } else { |         } else { | ||||||
|             ToastUtils.show(" No background."); |             ToastUtils.show("图片复制失败,请重试"); | ||||||
|             Drawable drawableBackground = getDrawable(R.drawable.blank10x10); |  | ||||||
|             drawableBackground.setAlpha(120); |  | ||||||
|             ivPreviewBackground.setImageDrawable(drawableBackground); |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 更新背景图片预览 | ||||||
|  |      */ | ||||||
|  |     public void updatePreviewBackground() { | ||||||
|  |         LogUtils.d(TAG, "updatePreviewBackground"); | ||||||
|  |         ImageView ivPreviewBackground = (ImageView) findViewById(R.id.activitybackgroundpictureImageView1); | ||||||
|  |         BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(this); | ||||||
|  |         utils.loadBackgroundPictureBean(); | ||||||
|  |  | ||||||
|  |         boolean isUseBackgroundFile = utils.getBackgroundPictureBean().isUseBackgroundFile(); | ||||||
|  |         if (isUseBackgroundFile && mfRecivedCropPicture.exists()) { | ||||||
|  |             try { | ||||||
|  |                 String filePath = utils.getBackgroundDir() + getBackgroundFileName(); | ||||||
|  |                 Drawable drawable = FileUtils.getImageDrawable(filePath); | ||||||
|  |                 if (drawable != null) { | ||||||
|  |                     //drawable.setAlpha(120); | ||||||
|  |                     ivPreviewBackground.setImageDrawable(drawable); | ||||||
|  |                 } | ||||||
|  |                 //ToastUtils.show("背景图片已更新"); | ||||||
|  |             } catch (IOException e) { | ||||||
|  |                 LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||||
|  |                 ToastUtils.show("背景图片加载失败"); | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             ToastUtils.show("未使用背景图片"); | ||||||
|  |             Drawable drawable = getResources().getDrawable(R.drawable.blank10x10); | ||||||
|  |             if (drawable != null) { | ||||||
|  |                 drawable.setAlpha(120); | ||||||
|  |                 ivPreviewBackground.setImageDrawable(drawable); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // 点击事件监听器 | ||||||
|     private View.OnClickListener onOriginNullClickListener = new View.OnClickListener() { |     private View.OnClickListener onOriginNullClickListener = new View.OnClickListener() { | ||||||
|         @Override |         @Override | ||||||
|         public void onClick(View v) { |         public void onClick(View v) { | ||||||
|             // 选择原始空白背景 |  | ||||||
|             BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(BackgroundPictureActivity.this); |             BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(BackgroundPictureActivity.this); | ||||||
|             BackgroundPictureBean bean = utils.getBackgroundPictureBean(); |             BackgroundPictureBean bean = utils.getBackgroundPictureBean(); | ||||||
|             bean.setIsUseBackgroundFile(false); |             bean.setIsUseBackgroundFile(false); | ||||||
| @@ -196,11 +200,10 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | |||||||
|     private View.OnClickListener onSelectPictureClickListener = new View.OnClickListener() { |     private View.OnClickListener onSelectPictureClickListener = new View.OnClickListener() { | ||||||
|         @Override |         @Override | ||||||
|         public void onClick(View v) { |         public void onClick(View v) { | ||||||
|             // 导入外部图片 |             if (checkAndRequestStoragePermission()) { | ||||||
|             Intent intent = new Intent( |                 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); | ||||||
|                 Intent.ACTION_PICK, |                 startActivityForResult(intent, REQUEST_SELECT_PICTURE); | ||||||
|                 android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); |             } | ||||||
|             startActivityForResult(intent, REQUEST_SELECT_PICTURE); |  | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -211,7 +214,7 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | |||||||
|             if (fCheck.exists()) { |             if (fCheck.exists()) { | ||||||
|                 startCropImageActivity(false); |                 startCropImageActivity(false); | ||||||
|             } else { |             } else { | ||||||
|                 ToastUtils.show("There is not any picture to crop."); |                 ToastUtils.show("没有可剪裁的图片"); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| @@ -223,7 +226,7 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | |||||||
|             if (fCheck.exists()) { |             if (fCheck.exists()) { | ||||||
|                 startCropImageActivity(true); |                 startCropImageActivity(true); | ||||||
|             } else { |             } else { | ||||||
|                 ToastUtils.show("There is not any picture to crop."); |                 ToastUtils.show("没有可剪裁的图片"); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| @@ -233,6 +236,7 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | |||||||
|         public void onClick(View v) { |         public void onClick(View v) { | ||||||
|             LogUtils.d(TAG, "onTakePhotoClickListener"); |             LogUtils.d(TAG, "onTakePhotoClickListener"); | ||||||
|             LogUtils.d(TAG, "mfTakePhoto : " + mfTakePhoto.getPath()); |             LogUtils.d(TAG, "mfTakePhoto : " + mfTakePhoto.getPath()); | ||||||
|  |  | ||||||
|             if (mfTakePhoto.exists()) { |             if (mfTakePhoto.exists()) { | ||||||
|                 mfTakePhoto.delete(); |                 mfTakePhoto.delete(); | ||||||
|             } |             } | ||||||
| @@ -240,56 +244,94 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | |||||||
|                 mfTakePhoto.createNewFile(); |                 mfTakePhoto.createNewFile(); | ||||||
|             } catch (IOException e) { |             } catch (IOException e) { | ||||||
|                 LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); |                 LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||||
|  |                 ToastUtils.show("拍照文件创建失败"); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (checkAndRequestStoragePermission()) { | ||||||
|  |                 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); | ||||||
|  |                 startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); | ||||||
|             } |             } | ||||||
|             Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); |  | ||||||
|             startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); |  | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     private View.OnClickListener onReceivedPictureClickListener = new View.OnClickListener() { |     private View.OnClickListener onReceivedPictureClickListener = new View.OnClickListener() { | ||||||
|         @Override |         @Override | ||||||
|         public void onClick(View v) { |         public void onClick(View v) { | ||||||
|             // 选择接收到的背景图片 |  | ||||||
|             BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(BackgroundPictureActivity.this); |             BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(BackgroundPictureActivity.this); | ||||||
| 			utils.getBackgroundPictureBean().setIsUseBackgroundFile(true); |             utils.getBackgroundPictureBean().setIsUseBackgroundFile(true); | ||||||
|             utils.saveData(); |             utils.saveData(); | ||||||
|             updatePreviewBackground(); |             updatePreviewBackground(); | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  | 	private View.OnClickListener onPixelPickerClickListener = new View.OnClickListener() { | ||||||
|  |         @Override | ||||||
|  |         public void onClick(View v) { | ||||||
|  | 			// 从文件路径启动像素拾取活动 | ||||||
|  | 			//String imagePath = "/storage/emulated/0/DCIM/Camera/sample.jpg"; | ||||||
|  | 			String imagePath = mfRecivedCropPicture.toString(); | ||||||
|  | 			Intent intent = new Intent(getApplicationContext(), PixelPickerActivity.class); | ||||||
|  | 			intent.putExtra("imagePath", imagePath); | ||||||
|  | 			startActivity(intent); | ||||||
|  |             //App.getWinBoLLActivityManager().startWinBoLLActivity(getActivity(), intent, PixelPickerActivity.class); | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | 	private View.OnClickListener onCleanPixelClickListener = new View.OnClickListener() { | ||||||
|  |         @Override | ||||||
|  |         public void onClick(View v) { | ||||||
|  | 			BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(BackgroundPictureActivity.this); | ||||||
|  | 			BackgroundPictureBean bean = utils.getBackgroundPictureBean(); | ||||||
|  | 			bean.setPixelColor(0); | ||||||
|  | 			utils.saveData(); | ||||||
|  | 			setBackgroundColor(); | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 压缩图片并保存到接收文件 | ||||||
|  |      */ | ||||||
|     void compressQualityToRecivedPicture(Bitmap bitmap) { |     void compressQualityToRecivedPicture(Bitmap bitmap) { | ||||||
|         // 设置输出流 |  | ||||||
|         OutputStream outStream = null; |         OutputStream outStream = null; | ||||||
|         try { |         try { | ||||||
|             // 创建输出流对象,准备写入压缩后的图片文件 |  | ||||||
|             mfRecivedPicture = getRecivedPictureFile(this); |             mfRecivedPicture = getRecivedPictureFile(this); | ||||||
|             // 创建新的接收文件 |  | ||||||
|             if (!mfRecivedPicture.exists()) { |             if (!mfRecivedPicture.exists()) { | ||||||
|                 mfRecivedPicture.createNewFile(); |                 mfRecivedPicture.createNewFile(); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             FileOutputStream fos = new FileOutputStream(mfRecivedPicture); |             FileOutputStream fos = new FileOutputStream(mfRecivedPicture); | ||||||
|  |  | ||||||
|             // 获取输出流对象 |  | ||||||
|             outStream = new BufferedOutputStream(fos); |             outStream = new BufferedOutputStream(fos); | ||||||
|  |             bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); | ||||||
|             // 使用默认的质量参数压缩图片 |  | ||||||
|             bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); // 70% 的质量 |  | ||||||
|  |  | ||||||
|             // 关闭输出流以完成文件操作 |  | ||||||
|             outStream.flush(); |             outStream.flush(); | ||||||
|             outStream.close(); |  | ||||||
|         } catch (IOException e) { |         } catch (IOException e) { | ||||||
|             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); |             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||||
|  |             ToastUtils.show("图片压缩失败"); | ||||||
|  |         } finally { | ||||||
|  |             if (outStream != null) { | ||||||
|  |                 try { | ||||||
|  |                     outStream.close(); | ||||||
|  |                 } catch (IOException e) { | ||||||
|  |                     LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if (bitmap != null && !bitmap.isRecycled()) { | ||||||
|  |                 bitmap.recycle(); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 启动图片裁剪活动 | ||||||
|  |      * @param isCropFree 是否自由裁剪 | ||||||
|  |      */ | ||||||
|     public void startCropImageActivity(boolean isCropFree) { |     public void startCropImageActivity(boolean isCropFree) { | ||||||
|         LogUtils.d(TAG, "startCropImageActivity"); |         LogUtils.d(TAG, "startCropImageActivity"); | ||||||
|         BackgroundPictureBean bean = mBackgroundPictureUtils.loadBackgroundPictureBean(); |         BackgroundPictureBean bean = mBackgroundPictureUtils.loadBackgroundPictureBean(); | ||||||
|         mfRecivedPicture = getRecivedPictureFile(this); |         mfRecivedPicture = getRecivedPictureFile(this); | ||||||
|         Uri uri = UriUtil.getUriForFile(this, mfRecivedPicture); |         Uri uri = UriUtil.getUriForFile(this, mfRecivedPicture); | ||||||
|         LogUtils.d(TAG, "uri : " + uri.toString()); |         LogUtils.d(TAG, "uri : " + uri.toString()); | ||||||
|  |  | ||||||
|         if (mfTempCropPicture.exists()) { |         if (mfTempCropPicture.exists()) { | ||||||
|             mfTempCropPicture.delete(); |             mfTempCropPicture.delete(); | ||||||
|         } |         } | ||||||
| @@ -297,27 +339,24 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | |||||||
|             mfTempCropPicture.createNewFile(); |             mfTempCropPicture.createNewFile(); | ||||||
|         } catch (IOException e) { |         } catch (IOException e) { | ||||||
|             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); |             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||||
|  |             ToastUtils.show("剪裁临时文件创建失败"); | ||||||
|  |             return; | ||||||
|         } |         } | ||||||
|         // 使用正确的文件路径构建 Uri |  | ||||||
|         Uri cropOutPutUri = Uri.fromFile(mfTempCropPicture); |         Uri cropOutPutUri = Uri.fromFile(mfTempCropPicture); | ||||||
|         LogUtils.d(TAG, "mfTempCropPicture : " + mfTempCropPicture.getPath()); |         LogUtils.d(TAG, "mfTempCropPicture : " + mfTempCropPicture.getPath()); | ||||||
|  |  | ||||||
|         Intent intent = new Intent("com.android.camera.action.CROP"); |         Intent intent = new Intent("com.android.camera.action.CROP"); | ||||||
|         intent.setDataAndType(uri, "image/" + _mszCommonFileType); |         intent.setDataAndType(uri, "image/" + _mszCommonFileType); | ||||||
|         // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 |  | ||||||
|         intent.putExtra("crop", "true"); |         intent.putExtra("crop", "true"); | ||||||
|         intent.putExtra("noFaceDetection", true); |         intent.putExtra("noFaceDetection", true); | ||||||
|  |  | ||||||
|         if (!isCropFree) { |         if (!isCropFree) { | ||||||
|             // aspectX aspectY 是宽高的比例 |  | ||||||
|             intent.putExtra("aspectX", bean.getBackgroundWidth()); |             intent.putExtra("aspectX", bean.getBackgroundWidth()); | ||||||
|             intent.putExtra("aspectY", bean.getBackgroundHeight()); |             intent.putExtra("aspectY", bean.getBackgroundHeight()); | ||||||
|         } |         } | ||||||
|         // outputX outputY 是裁剪图片宽高 |  | ||||||
|         //intent.putExtra("outputX", 100); |  | ||||||
|         //intent.putExtra("outputY", 100); |  | ||||||
|         //return-data =false 意味着裁剪成功后不能在onActivityResult 的intent 中获得图片 |  | ||||||
|         //intent.putExtra("return-data", false); |  | ||||||
|         intent.putExtra("return-data", true); |         intent.putExtra("return-data", true); | ||||||
|         //裁剪后的图片输出至  cropOutPutUri |  | ||||||
|         intent.putExtra(MediaStore.EXTRA_OUTPUT, cropOutPutUri); |         intent.putExtra(MediaStore.EXTRA_OUTPUT, cropOutPutUri); | ||||||
|         intent.putExtra("scale", true); |         intent.putExtra("scale", true); | ||||||
|         intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); |         intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); | ||||||
| @@ -325,13 +364,102 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | |||||||
|         startActivityForResult(intent, REQUEST_CROP_IMAGE); |         startActivityForResult(intent, REQUEST_CROP_IMAGE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // 启动裁剪窗口,裁剪操作文件为 uirImage |     /** | ||||||
|     // |      * 保存剪裁后的Bitmap(优化版) | ||||||
|  |      */ | ||||||
|  |     private void saveCropBitmap(Bitmap bitmap) { | ||||||
|  |         if (bitmap == null) { | ||||||
|  |             ToastUtils.show("剪裁图片为空"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 内存优化:大图片自动缩放 | ||||||
|  |         Bitmap scaledBitmap = bitmap; | ||||||
|  |         if (bitmap.getByteCount() > 10 * 1024 * 1024) { // 超过10MB | ||||||
|  |             float scale = 1.0f; | ||||||
|  |             while (scaledBitmap.getByteCount() > 5 * 1024 * 1024) { | ||||||
|  |                 scale -= 0.2f; // 每次缩小20% | ||||||
|  |                 if (scale < 0.2f) break; // 最小缩放到20% | ||||||
|  |                 scaledBitmap = scaleBitmap(scaledBitmap, scale); | ||||||
|  |             } | ||||||
|  |             if (scaledBitmap != bitmap) { | ||||||
|  |                 bitmap.recycle(); // 回收原Bitmap | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 优化:创建保存目录 | ||||||
|  |         File backgroundDir = new File(mBackgroundPictureUtils.getBackgroundDir()); | ||||||
|  |         if (!backgroundDir.exists()) { | ||||||
|  |             if (!backgroundDir.mkdirs()) { | ||||||
|  |                 ToastUtils.show("无法创建保存目录"); | ||||||
|  |                 if (scaledBitmap != bitmap) scaledBitmap.recycle(); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         File saveFile = new File(backgroundDir, getBackgroundFileName()); | ||||||
|  |  | ||||||
|  |         // 优化:检查文件是否可写 | ||||||
|  |         if (saveFile.exists() && !saveFile.canWrite()) { | ||||||
|  |             if (!saveFile.delete()) { | ||||||
|  |                 ToastUtils.show("无法删除旧文件"); | ||||||
|  |                 if (scaledBitmap != bitmap) scaledBitmap.recycle(); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         FileOutputStream fos = null; | ||||||
|  |         try { | ||||||
|  |             fos = new FileOutputStream(saveFile); | ||||||
|  |             boolean success = scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos); | ||||||
|  |             fos.flush(); | ||||||
|  |             if (success) { | ||||||
|  |                 ToastUtils.show("保存成功"); | ||||||
|  |                 // 更新数据 | ||||||
|  |                 mBackgroundPictureUtils.getBackgroundPictureBean().setIsUseBackgroundFile(true); | ||||||
|  |                 updatePreviewBackground(); | ||||||
|  |             } else { | ||||||
|  |                 ToastUtils.show("图片压缩保存失败"); | ||||||
|  |             } | ||||||
|  |         } catch (FileNotFoundException e) { | ||||||
|  |             LogUtils.e(TAG, "文件未找到" + e); | ||||||
|  |             ToastUtils.show("保存失败:文件路径错误"); | ||||||
|  |         } catch (IOException e) { | ||||||
|  |             LogUtils.e(TAG, "写入异常" + e); | ||||||
|  |             ToastUtils.show("保存失败:磁盘可能已满或路径错误"); | ||||||
|  |         } finally { | ||||||
|  |             if (fos != null) { | ||||||
|  |                 try { | ||||||
|  |                     fos.close(); | ||||||
|  |                 } catch (IOException e) { | ||||||
|  |                     LogUtils.e(TAG, "流关闭异常" + e); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             if (scaledBitmap != null && !scaledBitmap.isRecycled()) { | ||||||
|  |                 scaledBitmap.recycle(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 缩放Bitmap | ||||||
|  |      */ | ||||||
|  |     private Bitmap scaleBitmap(Bitmap original, float scale) { | ||||||
|  |         if (original == null) { | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |         int width = (int) (original.getWidth() * scale); | ||||||
|  |         int height = (int) (original.getHeight() * scale); | ||||||
|  |         return Bitmap.createScaledBitmap(original, width, height, true); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 分享图片 | ||||||
|  |      */ | ||||||
|     void sharePicture() { |     void sharePicture() { | ||||||
|         Uri uri = UriUtil.getUriForFile(this, mfRecivedPicture); |         Uri uri = UriUtil.getUriForFile(this, mfRecivedPicture); | ||||||
|         Intent shareIntent = new Intent();     |         Intent shareIntent = new Intent(Intent.ACTION_SEND); | ||||||
|         shareIntent.setAction(Intent.ACTION_SEND);     |         shareIntent.putExtra(Intent.EXTRA_STREAM, uri); | ||||||
|         shareIntent.putExtra(Intent.EXTRA_STREAM, uri);     |  | ||||||
|         shareIntent.setType("image/" + _mszCommonFileType); |         shareIntent.setType("image/" + _mszCommonFileType); | ||||||
|         shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); |         shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); | ||||||
|         startActivity(Intent.createChooser(shareIntent, "Share Image")); |         startActivity(Intent.createChooser(shareIntent, "Share Image")); | ||||||
| @@ -345,45 +473,121 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     protected void onActivityResult(int requestCode, int resultCode, Intent data) { |     protected void onActivityResult(int requestCode, int resultCode, Intent data) { | ||||||
|  |  | ||||||
|         super.onActivityResult(requestCode, resultCode, data); |         super.onActivityResult(requestCode, resultCode, data); | ||||||
|         if (requestCode == REQUEST_SELECT_PICTURE) { |         if (requestCode == REQUEST_SELECT_PICTURE && resultCode == RESULT_OK) { | ||||||
|             // 处理选择后图片 |             try { | ||||||
|             if (resultCode == RESULT_OK) { |                 Uri selectedImage = data.getData(); | ||||||
|                 try { |                 LogUtils.d(TAG, "Uri is : " + selectedImage.toString()); | ||||||
|                     Uri selectedImage = data.getData();  |                 File fSrcImage = new File(UriUtil.getFilePathFromUri(this, selectedImage)); | ||||||
|                     LogUtils.d(TAG, "Uri is : " + selectedImage.toString()); |                 mfRecivedPicture = getRecivedPictureFile(this); | ||||||
|                     File fSrcImage = new File(UriUtil.getFilePathFromUri(this, selectedImage)); |                 if (FileUtils.copyFile(fSrcImage, mfRecivedPicture)) { | ||||||
|                     mfRecivedPicture = getRecivedPictureFile(this); |  | ||||||
|  |  | ||||||
|                     FileUtils.copyFile(fSrcImage, mfRecivedPicture); |  | ||||||
|                     // 启动剪裁文件窗口 |  | ||||||
|                     startCropImageActivity(false); |                     startCropImageActivity(false); | ||||||
|                 } catch (Exception e) { |                 } else { | ||||||
|                     LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); |                     ToastUtils.show("图片复制失败,请重试"); | ||||||
|                 } |                 } | ||||||
|  |             } catch (Exception e) { | ||||||
|  |                 LogUtils.e(TAG, "选择图片异常" + e); | ||||||
|  |                 ToastUtils.show("选择图片失败:" + e.getMessage()); | ||||||
|             } |             } | ||||||
|         } else if (requestCode == REQUEST_TAKE_PHOTO) { |         } else if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) { | ||||||
|             if (resultCode == RESULT_OK) { |             LogUtils.d(TAG, "REQUEST_TAKE_PHOTO"); | ||||||
|                 LogUtils.d(TAG, "REQUEST_TAKE_PHOTO"); |             Bundle extras = data.getExtras(); | ||||||
|                 Bundle extras = data.getExtras(); |             if (extras != null) { | ||||||
|                 Bitmap imageBitmap = (Bitmap) extras.get("data"); |                 Bitmap imageBitmap = (Bitmap) extras.get("data"); | ||||||
|                 compressQualityToRecivedPicture(imageBitmap); |                 if (imageBitmap != null) { | ||||||
|                 startCropImageActivity(false); |                     compressQualityToRecivedPicture(imageBitmap); | ||||||
|             } |                     startCropImageActivity(false); | ||||||
|         } else if (requestCode == REQUEST_CROP_IMAGE) { |                 } else { | ||||||
|             if (resultCode == RESULT_OK) { |                     ToastUtils.show("拍照图片为空"); | ||||||
|                 LogUtils.d(TAG, "CROP_IMAGE_REQUEST_CODE"); |                 } | ||||||
|                 FileUtils.copyFile(mfTempCropPicture, mfRecivedCropPicture); |             } else { | ||||||
|                 mfTempCropPicture.delete(); |                 ToastUtils.show("拍照数据获取失败"); | ||||||
|                 mBackgroundPictureUtils.getBackgroundPictureBean().setIsUseBackgroundFile(true); |  | ||||||
|                 updatePreviewBackground(); |  | ||||||
|             } |             } | ||||||
|  |         } else if (requestCode == REQUEST_CROP_IMAGE && resultCode == RESULT_OK) { | ||||||
|  |             LogUtils.d(TAG, "CROP_IMAGE_REQUEST_CODE"); | ||||||
|  |             try { | ||||||
|  |                 Bitmap cropBitmap = null; | ||||||
|  |                 // 方案1:通过Intent获取剪裁后的Bitmap | ||||||
|  |                 if (data != null && data.hasExtra("data")) { | ||||||
|  |                     cropBitmap = data.getParcelableExtra("data"); | ||||||
|  |                 } else if (mfTempCropPicture.exists()) { | ||||||
|  |                     cropBitmap = BitmapFactory.decodeFile(mfTempCropPicture.getPath()); | ||||||
|  |                 } else { | ||||||
|  |                     ToastUtils.show("剪裁文件不存在"); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|         } else { |                 if (cropBitmap != null) { | ||||||
|             String sz = "Unsolved requestCode = " + Integer.toString(requestCode); |                     saveCropBitmap(cropBitmap); | ||||||
|             Toast.makeText(getApplication(), sz, Toast.LENGTH_SHORT).show(); |                 } else { | ||||||
|             LogUtils.d(TAG, sz); |                     ToastUtils.show("获取剪裁图片失败"); | ||||||
|  |                 } | ||||||
|  |             } catch (OutOfMemoryError e) { | ||||||
|  |                 LogUtils.e(TAG, "内存溢出" + e); | ||||||
|  |                 ToastUtils.show("保存失败:内存不足,请尝试裁剪更小的图片"); | ||||||
|  |             } catch (Exception e) { | ||||||
|  |                 LogUtils.e(TAG, "剪裁保存异常" + e); | ||||||
|  |                 ToastUtils.show("保存失败:" + e.getMessage()); | ||||||
|  |             }/* finally { | ||||||
|  | 			 // 安全删除临时文件 | ||||||
|  | 			 if (mfTempCropPicture.exists()) { | ||||||
|  | 			 mfTempCropPicture.delete(); | ||||||
|  | 			 } | ||||||
|  | 			 }*/ | ||||||
|  |         } else if (resultCode != RESULT_OK) { | ||||||
|  |             LogUtils.d(TAG, "操作取消或失败,requestCode: " + requestCode); | ||||||
|  |             ToastUtils.show("操作已取消"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 检查类型是否为图片 | ||||||
|  |      */ | ||||||
|  |     private boolean isImageType(String type) { | ||||||
|  |         return type.startsWith("image/") || "image/jpeg".equals(type) ||  | ||||||
|  |             "image/jpg".equals(type) || "image/png".equals(type) ||  | ||||||
|  |             "image/webp".equals(type); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 检查并申请存储权限 | ||||||
|  |      */ | ||||||
|  |     private boolean checkAndRequestStoragePermission() { | ||||||
|  |         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | ||||||
|  |             if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { | ||||||
|  |                 ActivityCompat.requestPermissions(this,  | ||||||
|  |                                                   new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},  | ||||||
|  |                                                   STORAGE_PERMISSION_REQUEST); | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { | ||||||
|  |         super.onRequestPermissionsResult(requestCode, permissions, grantResults); | ||||||
|  |         if (requestCode == STORAGE_PERMISSION_REQUEST) { | ||||||
|  |             if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | ||||||
|  |                 ToastUtils.show("存储权限已获取"); | ||||||
|  |             } else { | ||||||
|  |                 ToastUtils.show("需要存储权限才能保存图片"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | 	void setBackgroundColor() { | ||||||
|  | 		BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(BackgroundPictureActivity.this); | ||||||
|  | 		BackgroundPictureBean bean = utils.getBackgroundPictureBean(); | ||||||
|  | 		int nPixelColor = bean.getPixelColor(); | ||||||
|  | 		RelativeLayout mainLayout = findViewById(R.id.activitybackgroundpictureRelativeLayout1); | ||||||
|  | 		mainLayout.setBackgroundColor(nPixelColor); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	@Override | ||||||
|  | 	protected void onResume() { | ||||||
|  | 		super.onResume(); | ||||||
|  | 		setBackgroundColor(); | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -0,0 +1,251 @@ | |||||||
|  | package cc.winboll.studio.powerbell.activities; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @Author ZhanGSKen<zhangsken@188.com> | ||||||
|  |  * @Date 2025/06/22 14:15 | ||||||
|  |  */ | ||||||
|  | import android.app.Activity; | ||||||
|  | import android.app.Dialog; | ||||||
|  | import android.graphics.Bitmap; | ||||||
|  | import android.graphics.BitmapFactory; | ||||||
|  | import android.graphics.Color; | ||||||
|  | import android.os.Bundle; | ||||||
|  | import android.view.MenuItem; | ||||||
|  | import android.view.MotionEvent; | ||||||
|  | import android.view.View; | ||||||
|  | import android.view.ViewGroup; | ||||||
|  | import android.widget.Button; | ||||||
|  | import android.widget.ImageView; | ||||||
|  | import android.widget.RelativeLayout; | ||||||
|  | import android.widget.TextView; | ||||||
|  | import android.widget.Toast; | ||||||
|  | import cc.winboll.studio.libaes.views.AToolbar; | ||||||
|  | import cc.winboll.studio.libappbase.GlobalApplication; | ||||||
|  | import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; | ||||||
|  | import cc.winboll.studio.powerbell.MainActivity; | ||||||
|  | import cc.winboll.studio.powerbell.R; | ||||||
|  | import cc.winboll.studio.powerbell.activities.PixelPickerActivity; | ||||||
|  | import cc.winboll.studio.powerbell.beans.BackgroundPictureBean; | ||||||
|  | import cc.winboll.studio.powerbell.utils.BackgroundPictureUtils; | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.FileInputStream; | ||||||
|  | import java.io.FileNotFoundException; | ||||||
|  |  | ||||||
|  | public class PixelPickerActivity extends WinBoLLActivity implements IWinBoLLActivity { | ||||||
|  |  | ||||||
|  | 	public static final String TAG = "PixelPickerActivity"; | ||||||
|  |  | ||||||
|  | 	@Override | ||||||
|  | 	public Activity getActivity() { | ||||||
|  | 		return this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	@Override | ||||||
|  | 	public String getTag() { | ||||||
|  | 		return TAG; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	private AToolbar mAToolbar; | ||||||
|  | 	private ImageView imageView; | ||||||
|  | 	private Bitmap originalBitmap; | ||||||
|  | 	private TextView infoText; | ||||||
|  | 	private ViewGroup imageContainer; | ||||||
|  |  | ||||||
|  | 	@Override | ||||||
|  | 	protected void onCreate(Bundle savedInstanceState) { | ||||||
|  | 		super.onCreate(savedInstanceState); | ||||||
|  | 		setContentView(R.layout.activity_pixelpicker); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         // 初始化工具栏 | ||||||
|  |         mAToolbar = (AToolbar) findViewById(R.id.toolbar); | ||||||
|  |         setActionBar(mAToolbar); | ||||||
|  |         mAToolbar.setSubtitle(R.string.subtitle_activity_pixelpicker); | ||||||
|  |         getActionBar().setDisplayHomeAsUpEnabled(true); | ||||||
|  |         mAToolbar.setNavigationOnClickListener(new View.OnClickListener() { | ||||||
|  |                 @Override | ||||||
|  |                 public void onClick(View v) { | ||||||
|  |                     finish(); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  | 		imageView = findViewById(R.id.imageView); | ||||||
|  | 		infoText = findViewById(R.id.infoText); | ||||||
|  | 		imageContainer = findViewById(R.id.imageContainer); | ||||||
|  |  | ||||||
|  | 		// 从Intent获取图片路径并加载 | ||||||
|  | 		String imagePath = getIntent().getStringExtra("imagePath"); | ||||||
|  | 		if (imagePath != null) { | ||||||
|  | 			loadImage(imagePath); | ||||||
|  | 		} else { | ||||||
|  | 			infoText.setText("未找到图片路径"); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// 设置图片点击事件 | ||||||
|  | 		imageContainer.setOnTouchListener(new View.OnTouchListener() { | ||||||
|  | 				@Override | ||||||
|  | 				public boolean onTouch(View v, MotionEvent event) { | ||||||
|  | 					if (event.getAction() == MotionEvent.ACTION_DOWN && originalBitmap != null) { | ||||||
|  | 						// 计算点击位置在图片上的实际坐标 | ||||||
|  | 						float touchX = event.getX(); | ||||||
|  | 						float touchY = event.getY(); | ||||||
|  |  | ||||||
|  | 						int pixelX = -1, pixelY = -1; | ||||||
|  | 						try { | ||||||
|  | 							// 获取图片在容器中的实际位置和尺寸 | ||||||
|  | 							int[] imageLocation = new int[2]; | ||||||
|  | 							imageView.getLocationInWindow(imageLocation); | ||||||
|  | 							int imageWidth = imageView.getWidth(); | ||||||
|  | 							int imageHeight = imageView.getHeight(); | ||||||
|  |  | ||||||
|  | 							// 计算缩放比例 | ||||||
|  | 							float scaleX = (float) originalBitmap.getWidth() / imageWidth; | ||||||
|  | 							float scaleY = (float) originalBitmap.getHeight() / imageHeight; | ||||||
|  |  | ||||||
|  | 							// 调整触摸坐标到图片坐标系 | ||||||
|  | 							float adjustedX = touchX - imageLocation[0]; | ||||||
|  | 							float adjustedY = touchY - imageLocation[1]; | ||||||
|  |  | ||||||
|  | 							// 检查是否在图片范围内 | ||||||
|  | 							if (adjustedX >= 0 && adjustedX <= imageWidth && adjustedY >= 0 && adjustedY <= imageHeight) { | ||||||
|  | 								// 计算实际像素坐标 | ||||||
|  | 								pixelX = (int) (adjustedX * scaleX); | ||||||
|  | 								pixelY = (int) (adjustedY * scaleY); | ||||||
|  |  | ||||||
|  | 								// 再次检查像素坐标是否在有效范围内 | ||||||
|  | 								if (pixelX >= 0 && pixelX < originalBitmap.getWidth() &&  | ||||||
|  | 									pixelY >= 0 && pixelY < originalBitmap.getHeight()) { | ||||||
|  | 									int pixelColor = originalBitmap.getPixel(pixelX, pixelY); | ||||||
|  | 									showPixelDialog(pixelColor, pixelX, pixelY); | ||||||
|  | 								} else { | ||||||
|  | 									Toast.makeText(PixelPickerActivity.this, "像素坐标超出范围", Toast.LENGTH_SHORT).show(); | ||||||
|  | 								} | ||||||
|  | 							} else { | ||||||
|  | 								Toast.makeText(PixelPickerActivity.this, "点击位置超出图片显示范围", Toast.LENGTH_SHORT).show(); | ||||||
|  | 							} | ||||||
|  | 						} catch (Exception e) { | ||||||
|  | 							e.printStackTrace(); | ||||||
|  | 							Toast.makeText(PixelPickerActivity.this, "计算像素位置失败", Toast.LENGTH_SHORT).show(); | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 					return true; | ||||||
|  | 				} | ||||||
|  | 			}); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * 加载图片 | ||||||
|  | 	 */ | ||||||
|  | 	private void loadImage(String imagePath) { | ||||||
|  | 		try { | ||||||
|  | 			File file = new File(imagePath); | ||||||
|  | 			if (file.exists()) { | ||||||
|  | 				// 解码图片 | ||||||
|  | 				BitmapFactory.Options options = new BitmapFactory.Options(); | ||||||
|  | 				options.inSampleSize = 1; // 加载原图 | ||||||
|  | 				originalBitmap = BitmapFactory.decodeStream(new FileInputStream(file), null, options); | ||||||
|  |  | ||||||
|  | 				if (originalBitmap != null) { | ||||||
|  | 					imageView.setImageBitmap(originalBitmap); | ||||||
|  | 					infoText.setText("图片已加载,点击获取像素值"); | ||||||
|  | 				} else { | ||||||
|  | 					infoText.setText("图片加载失败"); | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				infoText.setText("图片文件不存在"); | ||||||
|  | 			} | ||||||
|  | 		} catch (FileNotFoundException e) { | ||||||
|  | 			e.printStackTrace(); | ||||||
|  | 			infoText.setText("图片文件未找到"); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * 显示像素对话框 | ||||||
|  | 	 */ | ||||||
|  | 	private void showPixelDialog(final int pixelColor, int x, int y) { | ||||||
|  | 		final Dialog dialog = new Dialog(this); | ||||||
|  | 		dialog.setContentView(R.layout.dialog_pixel); | ||||||
|  | 		dialog.setCancelable(true); | ||||||
|  |  | ||||||
|  | 		// 设置像素颜色视图背景 | ||||||
|  | 		TextView colorView = dialog.findViewById(R.id.pixelColorView); | ||||||
|  | 		colorView.setBackgroundColor(pixelColor); | ||||||
|  |  | ||||||
|  | 		// 显示颜色信息 | ||||||
|  | 		TextView infoText = dialog.findViewById(R.id.colorInfoText); | ||||||
|  | 		String colorInfo = String.format( | ||||||
|  | 			"RGB: (%d, %d, %d)\n" + | ||||||
|  | 			"ARGB: #%08X\n" + | ||||||
|  | 			"实际像素位置: (%d, %d)", | ||||||
|  | 			Color.red(pixelColor), | ||||||
|  | 			Color.green(pixelColor), | ||||||
|  | 			Color.blue(pixelColor), | ||||||
|  | 			pixelColor, | ||||||
|  | 			x, y); | ||||||
|  | 		infoText.setText(colorInfo); | ||||||
|  |  | ||||||
|  | 		// 设置确定按钮点击事件 | ||||||
|  | 		Button confirmButton = dialog.findViewById(R.id.confirmButton); | ||||||
|  | 		confirmButton.setOnClickListener(new View.OnClickListener() { | ||||||
|  | 				@Override | ||||||
|  | 				public void onClick(View v) { | ||||||
|  | 					dialog.dismiss(); | ||||||
|  | 					// 可以在这里添加确定后的回调逻辑 | ||||||
|  | 					BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(PixelPickerActivity.this); | ||||||
|  | 					BackgroundPictureBean bean = utils.getBackgroundPictureBean(); | ||||||
|  | 					bean.setPixelColor(pixelColor); | ||||||
|  | 					utils.saveData(); | ||||||
|  | 					Toast.makeText(PixelPickerActivity.this, "已记录像素值", Toast.LENGTH_SHORT).show(); | ||||||
|  | 					setBackgroundColor(); | ||||||
|  | 				} | ||||||
|  | 			}); | ||||||
|  |  | ||||||
|  | 		dialog.show(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	@Override | ||||||
|  | 	protected void onDestroy() { | ||||||
|  | 		super.onDestroy(); | ||||||
|  | 		// 回收Bitmap资源 | ||||||
|  | 		if (originalBitmap != null && !originalBitmap.isRecycled()) { | ||||||
|  | 			originalBitmap.recycle(); | ||||||
|  | 			originalBitmap = null; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	void setBackgroundColor() { | ||||||
|  | 		BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(PixelPickerActivity.this); | ||||||
|  | 		BackgroundPictureBean bean = utils.getBackgroundPictureBean(); | ||||||
|  | 		int nPixelColor = bean.getPixelColor(); | ||||||
|  | 		RelativeLayout mainLayout = findViewById(R.id.activitypixelpickerRelativeLayout1); | ||||||
|  | 		mainLayout.setBackgroundColor(nPixelColor); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	@Override | ||||||
|  | 	protected void onResume() { | ||||||
|  | 		super.onResume(); | ||||||
|  | 		setBackgroundColor(); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public boolean onOptionsItemSelected(MenuItem item) { | ||||||
|  |         if (item.getItemId() == android.R.id.home) { | ||||||
|  |             GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), BackgroundPictureActivity.class); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         // 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。 | ||||||
|  |         return super.onOptionsItemSelected(item); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | 	@Override | ||||||
|  | 	public void onBackPressed() { | ||||||
|  | 		super.onBackPressed(); | ||||||
|  | 		GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), BackgroundPictureActivity.class); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	 | ||||||
| @@ -0,0 +1,53 @@ | |||||||
|  | package cc.winboll.studio.powerbell.activities; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @Author ZhanGSKen<zhangsken@188.com> | ||||||
|  |  * @Date 2025/06/19 20:35 | ||||||
|  |  * @Describe 应用窗口基类 | ||||||
|  |  */ | ||||||
|  | import android.app.Activity; | ||||||
|  | import android.os.Bundle; | ||||||
|  | import android.view.MenuItem; | ||||||
|  | import cc.winboll.studio.libappbase.GlobalApplication; | ||||||
|  | import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; | ||||||
|  | import cc.winboll.studio.powerbell.App; | ||||||
|  | import cc.winboll.studio.powerbell.MainActivity; | ||||||
|  | import cc.winboll.studio.powerbell.R; | ||||||
|  |  | ||||||
|  | public abstract class WinBoLLActivity extends Activity implements IWinBoLLActivity { | ||||||
|  |  | ||||||
|  |     public static final String TAG = "WinBoLLActivity"; | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected void onCreate(Bundle savedInstanceState) { | ||||||
|  |         super.onCreate(savedInstanceState); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected void onPostCreate(Bundle savedInstanceState) { | ||||||
|  |         super.onPostCreate(savedInstanceState); | ||||||
|  |         GlobalApplication.getWinBoLLActivityManager().add(this); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected void onDestroy() { | ||||||
|  |         super.onDestroy(); | ||||||
|  |         GlobalApplication.getWinBoLLActivityManager().registeRemove(this); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public boolean onOptionsItemSelected(MenuItem item) { | ||||||
|  |         if (item.getItemId() == android.R.id.home) { | ||||||
|  |             GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), MainActivity.class); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         // 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。 | ||||||
|  |         return super.onOptionsItemSelected(item); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | 	@Override | ||||||
|  | 	public void onBackPressed() { | ||||||
|  | 		super.onBackPressed(); | ||||||
|  | 		GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), MainActivity.class); | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -17,6 +17,8 @@ public class BackgroundPictureBean extends BaseBean { | |||||||
|     int backgroundWidth = 100; |     int backgroundWidth = 100; | ||||||
|     int backgroundHeight = 100; |     int backgroundHeight = 100; | ||||||
|     boolean isUseBackgroundFile = false; |     boolean isUseBackgroundFile = false; | ||||||
|  | 	// 图片拾取像素颜色 | ||||||
|  | 	int pixelColor = 0; | ||||||
|  |  | ||||||
|     public BackgroundPictureBean() { |     public BackgroundPictureBean() { | ||||||
|     } |     } | ||||||
| @@ -25,6 +27,14 @@ public class BackgroundPictureBean extends BaseBean { | |||||||
|         this.isUseBackgroundFile = isUseBackgroundFile; |         this.isUseBackgroundFile = isUseBackgroundFile; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | 	public void setPixelColor(int pixelColor) { | ||||||
|  | 		this.pixelColor = pixelColor; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public int getPixelColor() { | ||||||
|  | 		return pixelColor; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|     public void setBackgroundWidth(int backgroundWidth) { |     public void setBackgroundWidth(int backgroundWidth) { | ||||||
|         this.backgroundWidth = backgroundWidth; |         this.backgroundWidth = backgroundWidth; | ||||||
|     } |     } | ||||||
| @@ -61,6 +71,7 @@ public class BackgroundPictureBean extends BaseBean { | |||||||
|         jsonWriter.name("backgroundWidth").value(bean.getBackgroundWidth()); |         jsonWriter.name("backgroundWidth").value(bean.getBackgroundWidth()); | ||||||
|         jsonWriter.name("backgroundHeight").value(bean.getBackgroundHeight()); |         jsonWriter.name("backgroundHeight").value(bean.getBackgroundHeight()); | ||||||
|         jsonWriter.name("isUseBackgroundFile").value(bean.isUseBackgroundFile()); |         jsonWriter.name("isUseBackgroundFile").value(bean.isUseBackgroundFile()); | ||||||
|  | 		jsonWriter.name("pixelColor").value(bean.getPixelColor()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
| @@ -75,6 +86,8 @@ public class BackgroundPictureBean extends BaseBean { | |||||||
|                 bean.setBackgroundHeight(jsonReader.nextInt()); |                 bean.setBackgroundHeight(jsonReader.nextInt()); | ||||||
|             } else if (name.equals("isUseBackgroundFile")) { |             } else if (name.equals("isUseBackgroundFile")) { | ||||||
|                 bean.setIsUseBackgroundFile(jsonReader.nextBoolean()); |                 bean.setIsUseBackgroundFile(jsonReader.nextBoolean()); | ||||||
|  |             } else if (name.equals("pixelColor")) { | ||||||
|  |                 bean.setPixelColor(jsonReader.nextInt()); | ||||||
|             } else { |             } else { | ||||||
|                 jsonReader.skipValue(); |                 jsonReader.skipValue(); | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -311,11 +311,11 @@ public class MainViewFragment extends Fragment { | |||||||
|         LogUtils.d(TAG, String.format("fBackgroundFilePath.exists() %s", fBackgroundFilePath.exists())); |         LogUtils.d(TAG, String.format("fBackgroundFilePath.exists() %s", fBackgroundFilePath.exists())); | ||||||
|         if (bean.isUseBackgroundFile() && fBackgroundFilePath.exists()) { |         if (bean.isUseBackgroundFile() && fBackgroundFilePath.exists()) { | ||||||
|             Drawable drawableBackground = Drawable.createFromPath(szBackgroundFilePath); |             Drawable drawableBackground = Drawable.createFromPath(szBackgroundFilePath); | ||||||
|             drawableBackground.setAlpha(120); |             //drawableBackground.setAlpha(120); | ||||||
|             imageView.setImageDrawable(drawableBackground); |             imageView.setImageDrawable(drawableBackground); | ||||||
|         } else { |         } else { | ||||||
|             Drawable drawableBackground = getActivity().getDrawable(R.drawable.blank10x10); |             Drawable drawableBackground = getActivity().getDrawable(R.drawable.blank10x10); | ||||||
|             drawableBackground.setAlpha(120); |             //drawableBackground.setAlpha(120); | ||||||
|             imageView.setImageDrawable(drawableBackground); |             imageView.setImageDrawable(drawableBackground); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <RelativeLayout | <LinearLayout | ||||||
| 	xmlns:android="http://schemas.android.com/apk/res/android" | 	xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
| 	xmlns:app="http://schemas.android.com/apk/res-auto" | 	xmlns:app="http://schemas.android.com/apk/res-auto" | ||||||
| 	android:orientation="vertical" | 	android:orientation="vertical" | ||||||
| @@ -12,83 +12,110 @@ | |||||||
| 		android:id="@+id/toolbar" | 		android:id="@+id/toolbar" | ||||||
| 		style="@style/DefaultAToolbar"/> | 		style="@style/DefaultAToolbar"/> | ||||||
|  |  | ||||||
| 	<ImageView | 	<RelativeLayout | ||||||
| 		android:layout_width="match_parent" | 		android:layout_width="wrap_content" | ||||||
| 		android:layout_height="match_parent" | 		android:layout_height="wrap_content"> | ||||||
| 		android:id="@+id/activitybackgroundpictureImageView1" |  | ||||||
| 		android:layout_below="@id/toolbar"> |  | ||||||
|  |  | ||||||
| 	</ImageView> |  | ||||||
|  |  | ||||||
| 	<LinearLayout |  | ||||||
| 		android:orientation="vertical" |  | ||||||
| 		android:layout_width="match_parent" |  | ||||||
| 		android:layout_height="wrap_content" |  | ||||||
| 		android:layout_below="@id/toolbar"> |  | ||||||
|  |  | ||||||
| 		<RelativeLayout | 		<RelativeLayout | ||||||
| 			android:layout_width="wrap_content" | 			android:layout_width="match_parent" | ||||||
| 			android:layout_height="wrap_content"> | 			android:layout_height="match_parent" | ||||||
|  | 			android:id="@+id/activitybackgroundpictureRelativeLayout1"/> | ||||||
|  |  | ||||||
| 			<cc.winboll.studio.libaes.views.AButton |  | ||||||
| 				android:layout_width="160dp" |  | ||||||
| 				android:layout_height="36dp" |  | ||||||
| 				android:text="Origin BG" |  | ||||||
| 				android:id="@+id/activitybackgroundpictureAButton5" |  | ||||||
| 				android:layout_alignParentLeft="true" |  | ||||||
| 				android:layout_margin="5dp"/> |  | ||||||
|  |  | ||||||
| 			<cc.winboll.studio.libaes.views.AButton | 		<ImageView | ||||||
| 				android:layout_width="160dp" | 			android:layout_width="match_parent" | ||||||
| 				android:layout_height="36dp" | 			android:layout_height="match_parent" | ||||||
| 				android:text="Received BG" | 			android:id="@+id/activitybackgroundpictureImageView1" | ||||||
| 				android:id="@+id/activitybackgroundpictureAButton4" | 			android:layout_below="@id/toolbar"> | ||||||
| 				android:layout_alignParentRight="true" |  | ||||||
| 				android:layout_margin="5dp"/> |  | ||||||
|  |  | ||||||
| 		</RelativeLayout> | 		</ImageView> | ||||||
|  |  | ||||||
| 		<LinearLayout | 		<LinearLayout | ||||||
| 			android:orientation="horizontal" | 			android:orientation="vertical" | ||||||
| 			android:layout_width="match_parent" | 			android:layout_width="match_parent" | ||||||
| 			android:layout_height="wrap_content" | 			android:layout_height="wrap_content" | ||||||
| 			android:gravity="right"> | 			android:layout_below="@id/toolbar"> | ||||||
|  |  | ||||||
| 			<cc.winboll.studio.libaes.views.AButton | 			<RelativeLayout | ||||||
| 				android:layout_width="50dp" | 				android:layout_width="wrap_content" | ||||||
| 				android:layout_height="36dp" | 				android:layout_height="wrap_content"> | ||||||
| 				android:text="◎" |  | ||||||
| 				android:layout_gravity="center_vertical" |  | ||||||
| 				android:layout_margin="10dp" |  | ||||||
| 				android:id="@+id/activitybackgroundpictureAButton1"/> |  | ||||||
|  |  | ||||||
| 			<cc.winboll.studio.libaes.views.AButton | 				<cc.winboll.studio.libaes.views.AButton | ||||||
| 				android:layout_width="50dp" | 					android:layout_width="160dp" | ||||||
| 				android:layout_height="36dp" | 					android:layout_height="36dp" | ||||||
| 				android:text="☑" | 					android:text="Origin BG" | ||||||
| 				android:layout_gravity="center_vertical" | 					android:id="@+id/activitybackgroundpictureAButton5" | ||||||
| 				android:layout_margin="10dp" | 					android:layout_alignParentLeft="true" | ||||||
| 				android:id="@+id/activitybackgroundpictureAButton2"/> | 					android:layout_margin="5dp"/> | ||||||
|  |  | ||||||
| 			<cc.winboll.studio.libaes.views.AButton | 				<cc.winboll.studio.libaes.views.AButton | ||||||
| 				android:layout_width="50dp" | 					android:layout_width="160dp" | ||||||
| 				android:layout_height="36dp" | 					android:layout_height="36dp" | ||||||
| 				android:text="[+]" | 					android:text="Received BG" | ||||||
| 				android:layout_gravity="center_vertical" | 					android:id="@+id/activitybackgroundpictureAButton4" | ||||||
| 				android:layout_margin="10dp" | 					android:layout_alignParentRight="true" | ||||||
| 				android:id="@+id/activitybackgroundpictureAButton3"/> | 					android:layout_margin="5dp"/> | ||||||
|  |  | ||||||
| 			<cc.winboll.studio.libaes.views.AButton | 			</RelativeLayout> | ||||||
| 				android:layout_width="50dp" |  | ||||||
| 				android:layout_height="36dp" | 			<LinearLayout | ||||||
| 				android:text="[+~]" | 				android:orientation="horizontal" | ||||||
| 				android:layout_gravity="center_vertical" | 				android:layout_width="match_parent" | ||||||
| 				android:layout_margin="10dp" | 				android:layout_height="wrap_content" | ||||||
| 				android:id="@+id/activitybackgroundpictureAButton6"/> | 				android:gravity="right"> | ||||||
|  |  | ||||||
|  | 				<cc.winboll.studio.libaes.views.AButton | ||||||
|  | 					android:layout_width="50dp" | ||||||
|  | 					android:layout_height="36dp" | ||||||
|  | 					android:text="◎" | ||||||
|  | 					android:layout_gravity="center_vertical" | ||||||
|  | 					android:layout_margin="5dp" | ||||||
|  | 					android:id="@+id/activitybackgroundpictureAButton1"/> | ||||||
|  |  | ||||||
|  | 				<cc.winboll.studio.libaes.views.AButton | ||||||
|  | 					android:layout_width="50dp" | ||||||
|  | 					android:layout_height="36dp" | ||||||
|  | 					android:text="☑" | ||||||
|  | 					android:layout_gravity="center_vertical" | ||||||
|  | 					android:layout_margin="5dp" | ||||||
|  | 					android:id="@+id/activitybackgroundpictureAButton2"/> | ||||||
|  |  | ||||||
|  | 				<cc.winboll.studio.libaes.views.AButton | ||||||
|  | 					android:layout_width="50dp" | ||||||
|  | 					android:layout_height="36dp" | ||||||
|  | 					android:text="[+]" | ||||||
|  | 					android:layout_gravity="center_vertical" | ||||||
|  | 					android:layout_margin="5dp" | ||||||
|  | 					android:id="@+id/activitybackgroundpictureAButton3"/> | ||||||
|  |  | ||||||
|  | 				<cc.winboll.studio.libaes.views.AButton | ||||||
|  | 					android:layout_width="50dp" | ||||||
|  | 					android:layout_height="36dp" | ||||||
|  | 					android:text="[+~]" | ||||||
|  | 					android:layout_gravity="center_vertical" | ||||||
|  | 					android:layout_margin="5dp" | ||||||
|  | 					android:id="@+id/activitybackgroundpictureAButton6"/> | ||||||
|  |  | ||||||
|  | 				<cc.winboll.studio.libaes.views.AButton | ||||||
|  | 					android:layout_width="50dp" | ||||||
|  | 					android:layout_height="36dp" | ||||||
|  | 					android:text="[◐]" | ||||||
|  | 					android:layout_gravity="center_vertical" | ||||||
|  | 					android:layout_margin="5dp" | ||||||
|  | 					android:id="@+id/activitybackgroundpictureAButton7"/> | ||||||
|  | 				 | ||||||
|  | 				<cc.winboll.studio.libaes.views.AButton | ||||||
|  | 					android:layout_width="50dp" | ||||||
|  | 					android:layout_height="36dp" | ||||||
|  | 					android:text="[○]" | ||||||
|  | 					android:layout_gravity="center_vertical" | ||||||
|  | 					android:layout_margin="5dp" | ||||||
|  | 					android:id="@+id/activitybackgroundpictureAButton8"/> | ||||||
|  | 				 | ||||||
|  | 			</LinearLayout> | ||||||
|  |  | ||||||
| 		</LinearLayout> | 		</LinearLayout> | ||||||
|  |  | ||||||
| 	</LinearLayout> | 	</RelativeLayout> | ||||||
|  | </LinearLayout> | ||||||
| </RelativeLayout> |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -25,12 +25,19 @@ | |||||||
|  |  | ||||||
| 	</LinearLayout> | 	</LinearLayout> | ||||||
|  |  | ||||||
| 	<TextView | 	<LinearLayout | ||||||
| 		android:layout_width="wrap_content" | 		android:orientation="horizontal" | ||||||
|  | 		android:layout_width="match_parent" | ||||||
| 		android:layout_height="wrap_content" | 		android:layout_height="wrap_content" | ||||||
| 		android:id="@+id/activityclearrecordTextView1" | 		android:gravity="center_horizontal"> | ||||||
| 		android:gravity="center_horizontal" |  | ||||||
| 		android:layout_gravity="center_horizontal"/> | 		<TextView | ||||||
|  | 			android:layout_width="wrap_content" | ||||||
|  | 			android:layout_height="wrap_content" | ||||||
|  | 			android:id="@+id/activityclearrecordTextView1" | ||||||
|  | 			android:textAppearance="?android:attr/textAppearanceSmall"/> | ||||||
|  |  | ||||||
|  | 	</LinearLayout> | ||||||
|  |  | ||||||
| 	<LinearLayout | 	<LinearLayout | ||||||
| 		android:orientation="vertical" | 		android:orientation="vertical" | ||||||
|   | |||||||
| @@ -2,42 +2,34 @@ | |||||||
| <LinearLayout | <LinearLayout | ||||||
| 	xmlns:android="http://schemas.android.com/apk/res/android" | 	xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
| 	xmlns:app="http://schemas.android.com/apk/res-auto" | 	xmlns:app="http://schemas.android.com/apk/res-auto" | ||||||
|     android:layout_width="match_parent" | 	android:layout_width="match_parent" | ||||||
| 	android:layout_height="match_parent" | 	android:layout_height="match_parent" | ||||||
| 	android:orientation="vertical"> | 	android:orientation="vertical"> | ||||||
|  |  | ||||||
| 	<LinearLayout | 	<cc.winboll.studio.libaes.views.AToolbar | ||||||
| 		android:orientation="horizontal" |  | ||||||
| 		android:layout_width="match_parent" | 		android:layout_width="match_parent" | ||||||
| 		android:layout_height="wrap_content"> | 		android:layout_height="@dimen/toolbar_height" | ||||||
|  | 		android:id="@+id/toolbar" | ||||||
|  | 		android:gravity="center_vertical" | ||||||
|  | 		style="@style/DefaultAToolbar"/> | ||||||
|  |  | ||||||
| 		<cc.winboll.studio.libaes.views.AToolbar | 	<RelativeLayout | ||||||
| 			android:layout_width="match_parent" |  | ||||||
| 			android:layout_height="@dimen/toolbar_height" |  | ||||||
| 			android:id="@+id/toolbar" |  | ||||||
| 			android:gravity="center_vertical" |  | ||||||
| 			style="@style/DefaultAToolbar"/> |  | ||||||
|  |  | ||||||
| 	</LinearLayout> |  | ||||||
|  |  | ||||||
| 	<LinearLayout |  | ||||||
| 		android:orientation="vertical" |  | ||||||
| 		android:layout_width="match_parent" | 		android:layout_width="match_parent" | ||||||
| 		android:layout_height="wrap_content" | 		android:layout_height="0dp" | ||||||
| 		android:layout_weight="1.0"> | 		android:layout_weight="1.0"> | ||||||
|  |  | ||||||
|  | 		<RelativeLayout | ||||||
|  | 			android:layout_width="match_parent" | ||||||
|  | 			android:layout_height="match_parent" | ||||||
|  | 			android:id="@+id/activitymainRelativeLayout1" | ||||||
|  | 			android:background="#FFEE2121"/> | ||||||
|  |  | ||||||
| 		<FrameLayout | 		<FrameLayout | ||||||
| 			android:layout_width="match_parent" | 			android:layout_width="match_parent" | ||||||
| 			android:layout_height="match_parent" | 			android:layout_height="match_parent" | ||||||
| 			android:id="@+id/activitymainFrameLayout1"/> | 			android:id="@+id/activitymainFrameLayout1"/> | ||||||
|  |  | ||||||
| 	</LinearLayout> | 	</RelativeLayout> | ||||||
|  |  | ||||||
| 	<cc.winboll.studio.libappbase.LogView |  | ||||||
| 		android:orientation="horizontal" |  | ||||||
| 		android:layout_width="match_parent" |  | ||||||
| 		android:layout_height="200dp" |  | ||||||
| 		android:id="@+id/logview"/> |  | ||||||
|  |  | ||||||
| </LinearLayout> | </LinearLayout> | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										54
									
								
								powerbell/src/main/res/layout/activity_pixelpicker.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								powerbell/src/main/res/layout/activity_pixelpicker.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <LinearLayout | ||||||
|  | 	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="match_parent" | ||||||
|  | 	android:orientation="vertical"> | ||||||
|  |  | ||||||
|  | 	<cc.winboll.studio.libaes.views.AToolbar | ||||||
|  | 		android:layout_width="match_parent" | ||||||
|  | 		android:layout_height="@dimen/toolbar_height" | ||||||
|  | 		android:id="@+id/toolbar" | ||||||
|  | 		android:gravity="center_vertical" | ||||||
|  | 		style="@style/DefaultAToolbar"/> | ||||||
|  |  | ||||||
|  | 	<RelativeLayout | ||||||
|  | 		android:layout_width="match_parent" | ||||||
|  | 		android:layout_height="0dp" | ||||||
|  | 		android:layout_weight="1.0"> | ||||||
|  |  | ||||||
|  | 		<RelativeLayout | ||||||
|  | 			android:layout_width="match_parent" | ||||||
|  | 			android:layout_height="match_parent" | ||||||
|  | 			android:background="#FFEE2121" | ||||||
|  | 			android:id="@+id/activitypixelpickerRelativeLayout1"/> | ||||||
|  |  | ||||||
|  | 		<FrameLayout | ||||||
|  | 			android:id="@+id/imageContainer" | ||||||
|  | 			android:layout_width="match_parent" | ||||||
|  | 			android:layout_height="match_parent"> | ||||||
|  |  | ||||||
|  | 			<ImageView | ||||||
|  | 				android:id="@+id/imageView" | ||||||
|  | 				android:layout_width="match_parent" | ||||||
|  | 				android:layout_height="match_parent" | ||||||
|  | 				android:src="@drawable/ic_launcher"/> | ||||||
|  |  | ||||||
|  | 		</FrameLayout> | ||||||
|  |  | ||||||
|  | 		<TextView | ||||||
|  | 			android:id="@+id/infoText" | ||||||
|  | 			android:layout_width="wrap_content" | ||||||
|  | 			android:layout_height="wrap_content" | ||||||
|  | 			android:layout_alignParentBottom="true" | ||||||
|  | 			android:layout_centerHorizontal="true" | ||||||
|  | 			android:padding="10dp" | ||||||
|  | 			android:background="#80000000" | ||||||
|  | 			android:textColor="#FFFFFF" | ||||||
|  | 			android:text="点击图片获取像素值"/> | ||||||
|  |  | ||||||
|  | 	</RelativeLayout> | ||||||
|  |  | ||||||
|  | </LinearLayout> | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								powerbell/src/main/res/layout/dialog_pixel.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								powerbell/src/main/res/layout/dialog_pixel.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     android:layout_width="240dp" | ||||||
|  |     android:layout_height="wrap_content" | ||||||
|  |     android:orientation="vertical" | ||||||
|  |     android:padding="16dp"> | ||||||
|  |  | ||||||
|  |     <TextView | ||||||
|  |         android:id="@+id/pixelColorView" | ||||||
|  |         android:layout_width="200dp" | ||||||
|  |         android:layout_height="200dp" | ||||||
|  |         android:layout_gravity="center_horizontal" /> | ||||||
|  |  | ||||||
|  |     <TextView | ||||||
|  |         android:id="@+id/colorInfoText" | ||||||
|  |         android:layout_width="wrap_content" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_gravity="center_horizontal" | ||||||
|  |         android:layout_marginTop="8dp" | ||||||
|  |         android:textColor="#333333" | ||||||
|  |         android:textSize="14sp" /> | ||||||
|  |  | ||||||
|  |     <Button | ||||||
|  |         android:id="@+id/confirmButton" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_marginTop="16dp" | ||||||
|  |         android:background="@android:color/holo_blue_light" | ||||||
|  |         android:text="确定" | ||||||
|  |         android:textColor="@android:color/white" /> | ||||||
|  | </LinearLayout> | ||||||
|  |  | ||||||
| @@ -43,15 +43,6 @@ | |||||||
|  |  | ||||||
| 			</LinearLayout> | 			</LinearLayout> | ||||||
|  |  | ||||||
| 			<TextView |  | ||||||
| 				android:layout_width="match_parent" |  | ||||||
| 				android:layout_height="wrap_content" |  | ||||||
| 				android:text="Tips" |  | ||||||
| 				android:textSize="@dimen/text_content_size" |  | ||||||
| 				android:id="@+id/fragmentandroidviewTextView1" |  | ||||||
| 				android:background="@drawable/bg_frame" |  | ||||||
| 				android:padding="10dp"/> |  | ||||||
|  |  | ||||||
| 		</LinearLayout> | 		</LinearLayout> | ||||||
|  |  | ||||||
| 		<LinearLayout | 		<LinearLayout | ||||||
| @@ -205,6 +196,21 @@ | |||||||
|  |  | ||||||
| 		</LinearLayout> | 		</LinearLayout> | ||||||
|  |  | ||||||
|  | 		<LinearLayout | ||||||
|  | 			android:layout_height="wrap_content" | ||||||
|  | 			android:layout_width="match_parent"> | ||||||
|  |  | ||||||
|  | 			<TextView | ||||||
|  | 				android:layout_width="match_parent" | ||||||
|  | 				android:layout_height="wrap_content" | ||||||
|  | 				android:text="Tips" | ||||||
|  | 				android:textSize="@dimen/text_content_size" | ||||||
|  | 				android:id="@+id/fragmentandroidviewTextView1" | ||||||
|  | 				android:background="@drawable/bg_frame" | ||||||
|  | 				android:padding="10dp"/> | ||||||
|  |  | ||||||
|  | 		</LinearLayout> | ||||||
|  |  | ||||||
| 	</LinearLayout> | 	</LinearLayout> | ||||||
|  |  | ||||||
| </RelativeLayout> | </RelativeLayout> | ||||||
|   | |||||||
| @@ -9,6 +9,9 @@ | |||||||
|     <item |     <item | ||||||
|         android:id="@+id/action_changepicture" |         android:id="@+id/action_changepicture" | ||||||
|         android:title="@string/item_changepicture"/> |         android:title="@string/item_changepicture"/> | ||||||
|  |     <item | ||||||
|  |         android:id="@+id/action_log" | ||||||
|  |         android:title="@string/item_logview"/> | ||||||
|     <item |     <item | ||||||
|         android:id="@+id/action_about" |         android:id="@+id/action_about" | ||||||
|         android:title="@string/item_aboutview"/> |         android:title="@string/item_aboutview"/> | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ | |||||||
|     <string name="texthint_CustomSlideToCleanRecord">Slide Right To Clean Up APP Record.</string> |     <string name="texthint_CustomSlideToCleanRecord">Slide Right To Clean Up APP Record.</string> | ||||||
|     <string name="subtitle_activity_clearrecord">清理记录</string> |     <string name="subtitle_activity_clearrecord">清理记录</string> | ||||||
|     <string name="subtitle_activity_backgroundpicture">更换背景图片</string> |     <string name="subtitle_activity_backgroundpicture">更换背景图片</string> | ||||||
|  |     <string name="subtitle_activity_pixelpicker">背景像素拾取</string> | ||||||
|     <string name="subtitle_activity_about">关于应用</string> |     <string name="subtitle_activity_about">关于应用</string> | ||||||
|     <string name="msg_AOHPCTCSeekBar_ClearRecord">>>>Seek 100% To Clear Battery Record.>>></string> | 	<string name="msg_AOHPCTCSeekBar_ClearRecord">>>>向右滑动100%可以清理电量记录。>>></string> | ||||||
| </resources> | </resources> | ||||||
|   | |||||||
| @@ -18,6 +18,7 @@ | |||||||
|     <string name="texthint_CustomSlideToCleanRecord">Slide Right To Clean Up APP Record.</string> |     <string name="texthint_CustomSlideToCleanRecord">Slide Right To Clean Up APP Record.</string> | ||||||
|     <string name="subtitle_activity_clearrecord">Clean Record</string> |     <string name="subtitle_activity_clearrecord">Clean Record</string> | ||||||
|     <string name="subtitle_activity_backgroundpicture">Background Picture</string> |     <string name="subtitle_activity_backgroundpicture">Background Picture</string> | ||||||
|  |     <string name="subtitle_activity_pixelpicker">Pixel Picker</string> | ||||||
|     <string name="subtitle_activity_about">About The APP</string> |     <string name="subtitle_activity_about">About The APP</string> | ||||||
|     <string name="msg_AOHPCTCSeekBar_ClearRecord">>>>Seek 100% To Clear Battery Record.>>></string> |     <string name="msg_AOHPCTCSeekBar_ClearRecord">>>>Seek 100% Right Is Clean Record.>>></string> | ||||||
| </resources> | </resources> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 ZhanGSKen
					ZhanGSKen