Merge remote-tracking branch 'gitee/powerbell' into appbase
This commit is contained in:
		| @@ -45,9 +45,9 @@ android { | ||||
|  | ||||
| dependencies { | ||||
|     api fileTree(dir: 'libs', include: ['*.jar']) | ||||
|     api 'cc.winboll.studio:libaes:15.6.0' | ||||
|     api 'cc.winboll.studio:libapputils:15.3.4' | ||||
|     api 'cc.winboll.studio:libappbase:15.7.6' | ||||
|     api 'cc.winboll.studio:libaes:15.9.3' | ||||
|     api 'cc.winboll.studio:libapputils:15.8.5' | ||||
|     api 'cc.winboll.studio:libappbase:15.9.5' | ||||
|      | ||||
|     // 吐司提示库 | ||||
|     api 'com.github.getActivity:ToastUtils:10.5' | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| #Created by .winboll/winboll_app_build.gradle | ||||
| #Thu May 29 09:43:37 HKT 2025 | ||||
| stageCount=2 | ||||
| #Sun Aug 31 06:21:48 CST 2025 | ||||
| stageCount=12 | ||||
| libraryProject= | ||||
| baseVersion=15.4 | ||||
| publishVersion=15.4.1 | ||||
| publishVersion=15.4.11 | ||||
| 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.PixelPickerActivity"/> | ||||
|  | ||||
|     </application> | ||||
|  | ||||
| </manifest> | ||||
| @@ -1,6 +1,7 @@ | ||||
| package cc.winboll.studio.powerbell; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.os.Environment; | ||||
| import android.view.Gravity; | ||||
| import cc.winboll.studio.libappbase.GlobalApplication; | ||||
| import cc.winboll.studio.powerbell.receivers.GlobalApplicationReceiver; | ||||
| @@ -27,12 +28,21 @@ public class App extends GlobalApplication { | ||||
|     public void onCreate() { | ||||
|         super.onCreate(); | ||||
|  | ||||
|         // 初始化临时文件夹目录 | ||||
|         File fTempDir = new File(getExternalCacheDir(), "TempDir"); | ||||
|         if(!fTempDir.exists()) { | ||||
|             fTempDir.mkdirs(); | ||||
|         // 临时文件夹方案1 | ||||
|         // 获取Pictures文件夹路径(Android 10及以上推荐使用MediaStore,此处为传统方式) | ||||
|         File picturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); | ||||
|         // 定义目标文件路径(在Pictures目录下创建"PowerBell"子文件夹及文件) | ||||
|         File powerBellDir = new File(picturesDir, "PowerBell"); | ||||
|          | ||||
|         // 临时文件夹方案2 <图片保存失败> | ||||
|         // 获取Pictures文件夹路径(Android 10及以上推荐使用MediaStore,此处为传统方式) | ||||
|         //File powerBellDir = getExternalFilesDir("TempDir"); | ||||
|  | ||||
|         // 先创建文件夹(如果不存在) | ||||
|         if (!powerBellDir.exists()) { | ||||
|             powerBellDir.mkdirs(); | ||||
|         } | ||||
|         szTempDir = fTempDir.getAbsolutePath(); | ||||
|         szTempDir = powerBellDir.getAbsolutePath(); | ||||
|  | ||||
|  | ||||
|         // 初始化 Toast 框架 | ||||
|   | ||||
| @@ -10,23 +10,27 @@ import android.os.Bundle; | ||||
| import android.provider.MediaStore; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import android.widget.RelativeLayout; | ||||
| import android.widget.Toast; | ||||
| import cc.winboll.studio.libaes.views.AToolbar; | ||||
| import cc.winboll.studio.libappbase.LogUtils; | ||||
| import cc.winboll.studio.libappbase.LogView; | ||||
| import cc.winboll.studio.powerbell.MainActivity; | ||||
| import cc.winboll.studio.powerbell.activities.AboutActivity; | ||||
| import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity; | ||||
| import cc.winboll.studio.powerbell.activities.BatteryReporterActivity; | ||||
| 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.utils.BackgroundPictureUtils; | ||||
|  | ||||
| public class MainActivity extends WinBoLLActivity { | ||||
|  | ||||
| public class MainActivity extends Activity { | ||||
|     public static final String TAG = "MainActivity"; | ||||
|     public static final int BACKGROUND_PICTURE_REQUEST_CODE = 0; | ||||
|  | ||||
|     public static MainActivity _mMainActivity; | ||||
|     LogView mLogView; | ||||
|     //LogView mLogView; | ||||
|     //ArrayList<Fragment> mlistFragment; | ||||
|     App mApplication; | ||||
|     //AppConfigUtils mAppConfigUtils; | ||||
| @@ -35,6 +39,16 @@ public class MainActivity extends Activity { | ||||
|     MainViewFragment mMainViewFragment; | ||||
|     AToolbar mAToolbar; | ||||
|  | ||||
|     @Override | ||||
|     public Activity getActivity() { | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getTag() { | ||||
|         return TAG; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         //LogUtils.d(TAG, "onCreate(...)"); | ||||
| @@ -42,10 +56,10 @@ public class MainActivity extends Activity { | ||||
|         setContentView(R.layout.activity_main); | ||||
|  | ||||
|         // 设置调试日志 | ||||
|         mLogView = findViewById(R.id.logview); | ||||
|         mLogView.start(); | ||||
|         //LogUtils.d(TAG, "LogView Start."); | ||||
|         mLogView.updateLogView(); | ||||
| //        mLogView = findViewById(R.id.logview); | ||||
| //        mLogView.start(); | ||||
| //        //LogUtils.d(TAG, "LogView Start."); | ||||
| //        mLogView.updateLogView(); | ||||
|  | ||||
|         _mMainActivity = MainActivity.this; | ||||
|         mApplication = (App) getApplication(); | ||||
| @@ -117,8 +131,8 @@ public class MainActivity extends Activity { | ||||
|         super.onResume(); | ||||
|         // 回到窗口自动取消提醒消息 | ||||
|         //NotificationHelper.cancelRemindNotification(this); | ||||
|  | ||||
|         reloadBackground(); | ||||
| 		setBackgroundColor(); | ||||
|     } | ||||
|  | ||||
|     // Menu icons are inflated just as they were with actionbar | ||||
| @@ -157,6 +171,8 @@ public class MainActivity extends Activity { | ||||
|             Intent intent = new Intent(); | ||||
|             intent.setClass(this, BackgroundPictureActivity.class); | ||||
|             startActivity(intent); | ||||
|         } else if (menuItemId == R.id.action_log) { | ||||
|             App.getWinBoLLActivityManager().startLogActivity(this); | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
| @@ -193,4 +209,12 @@ public class MainActivity extends Activity { | ||||
|             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.setAppIcon(R.drawable.ic_launcher); | ||||
|         appInfo.setAppDescription(getString(R.string.app_description)); | ||||
|         appInfo.setAppGitName("APP"); | ||||
|         appInfo.setAppGitName("APPBase"); | ||||
|         appInfo.setAppGitOwner("Studio"); | ||||
|         appInfo.setAppGitAPPBranch(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.setAppAPKFolderName("PowerBell"); | ||||
|         return new AboutView(mContext, appInfo); | ||||
|   | ||||
| @@ -1,22 +1,27 @@ | ||||
| package cc.winboll.studio.powerbell.activities; | ||||
|  | ||||
| import android.Manifest; | ||||
| import android.app.Activity; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.graphics.Bitmap; | ||||
| import android.graphics.BitmapFactory; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.net.Uri; | ||||
| import android.os.Build; | ||||
| import android.os.Bundle; | ||||
| import android.provider.MediaStore; | ||||
| import android.view.View; | ||||
| 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.libappbase.LogUtils; | ||||
| import cc.winboll.studio.libappbase.utils.ToastUtils; | ||||
| import cc.winboll.studio.powerbell.App; | ||||
| 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.dialogs.BackgroundPicturePreviewDialog; | ||||
| 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 java.io.BufferedOutputStream; | ||||
| import java.io.File; | ||||
| import java.io.FileNotFoundException; | ||||
| import java.io.FileOutputStream; | ||||
| import java.io.IOException; | ||||
| import java.io.OutputStream; | ||||
|  | ||||
| public class BackgroundPictureActivity extends Activity | ||||
| implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
| public class BackgroundPictureActivity extends WinBoLLActivity implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|  | ||||
|     public static final String TAG = "BackgroundPictureActivity"; | ||||
|  | ||||
|     public BackgroundPictureUtils mBackgroundPictureUtils; | ||||
|  | ||||
|     // 图片选择请求 | ||||
|     // 图片选择请求码 | ||||
|     public static final int REQUEST_SELECT_PICTURE = 0; | ||||
|     // 照相选择请求 | ||||
|     public static final int REQUEST_TAKE_PHOTO = 1; | ||||
|     // 图片裁剪选择请求 | ||||
|     public static final int REQUEST_CROP_IMAGE = 2; | ||||
|     private static final int STORAGE_PERMISSION_REQUEST = 100; | ||||
|  | ||||
|     AToolbar mAToolbar; | ||||
|     // 所有图片存储的文件夹 | ||||
|     File mfBackgroundDir; | ||||
|     // 拍照与剪裁的文件夹 | ||||
|     File mfPictureDir; | ||||
|     // 拍照文件类 | ||||
|     File mfTakePhoto; | ||||
|     // 接收到的图片文件类 | ||||
|     public File mfRecivedPicture; | ||||
|     // 剪裁文件类 | ||||
|     File mfTempCropPicture; | ||||
|     // 剪裁接收后的文件的文件名 | ||||
|     private AToolbar mAToolbar; | ||||
|     private File mfBackgroundDir;       // 背景图片存储文件夹 | ||||
|     private File mfPictureDir;          // 拍照与剪裁临时文件夹 | ||||
|     private File mfTakePhoto;           // 拍照文件 | ||||
|     private File mfRecivedPicture;      // 接收的图片文件 | ||||
|     private File mfTempCropPicture;     // 剪裁临时文件 | ||||
|     private File mfRecivedCropPicture;  // 剪裁后的目标文件 | ||||
|  | ||||
|     // 静态变量 | ||||
|     public static String _mszRecivedCropPicture = "RecivedCrop.jpg"; | ||||
|     File mfRecivedCropPicture; | ||||
|     static String _mszCommonFileType = "jpeg"; | ||||
|     // 背景图片的压缩比 | ||||
|     int mnPictureCompress = 100; | ||||
|     static String _RecivedPictureFileName; | ||||
|     private static String _mszCommonFileType = "jpeg"; | ||||
|     private int mnPictureCompress = 100; | ||||
|     private static String _RecivedPictureFileName; | ||||
|  | ||||
| 	@Override | ||||
| 	public Activity getActivity() { | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public String getTag() { | ||||
| 		return TAG; | ||||
| 	} | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
| @@ -67,30 +75,29 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|         setContentView(R.layout.activity_backgroundpicture); | ||||
|         initEnv(); | ||||
|  | ||||
|         // 初始化工具类和文件夹 | ||||
|         mBackgroundPictureUtils = BackgroundPictureUtils.getInstance(this); | ||||
|         mfBackgroundDir = new File(mBackgroundPictureUtils.getBackgroundDir()); | ||||
|         if (!mfBackgroundDir.exists()) { | ||||
|             mfBackgroundDir.mkdirs(); | ||||
|         } | ||||
|         //mfPictureDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), getString(R.string.app_projectname)); | ||||
|  | ||||
|         mfPictureDir = new File(App.getTempDirPath()); | ||||
|         if (!mfPictureDir.exists()) { | ||||
|             mfPictureDir.mkdirs(); | ||||
|         } | ||||
|  | ||||
|         // 初始化文件对象 | ||||
|         mfTakePhoto = new File(mfPictureDir, "TakePhoto.jpg"); | ||||
|         mfTempCropPicture = new File(mfPictureDir, "TempCrop.jpg"); | ||||
|  | ||||
|         mfRecivedPicture = getRecivedPictureFile(this); | ||||
|         mfRecivedCropPicture = new File(mfBackgroundDir, _mszRecivedCropPicture); | ||||
|  | ||||
|         // 初始化工具栏 | ||||
|         mAToolbar = (AToolbar) findViewById(R.id.toolbar); | ||||
|         setActionBar(mAToolbar); | ||||
|         //mAToolbar.setTitle(getTitle() + "-" + getString(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); | ||||
|         mAToolbar.setNavigationOnClickListener(new View.OnClickListener() { | ||||
|                 @Override | ||||
| @@ -99,41 +106,30 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|         //给按钮设置点击事件 | ||||
|         // 设置按钮点击事件 | ||||
|         findViewById(R.id.activitybackgroundpictureAButton5).setOnClickListener(onOriginNullClickListener); | ||||
|         findViewById(R.id.activitybackgroundpictureAButton4).setOnClickListener(onReceivedPictureClickListener); | ||||
|         findViewById(R.id.activitybackgroundpictureAButton1).setOnClickListener(onTakePhotoClickListener); | ||||
|         findViewById(R.id.activitybackgroundpictureAButton2).setOnClickListener(onSelectPictureClickListener); | ||||
|         findViewById(R.id.activitybackgroundpictureAButton3).setOnClickListener(onCropPictureClickListener); | ||||
|         findViewById(R.id.activitybackgroundpictureAButton6).setOnClickListener(onCropFreePictureClickListener); | ||||
| 		findViewById(R.id.activitybackgroundpictureAButton7).setOnClickListener(onPixelPickerClickListener); | ||||
| 		findViewById(R.id.activitybackgroundpictureAButton8).setOnClickListener(onCleanPixelClickListener); | ||||
|  | ||||
|         updatePreviewBackground(); | ||||
|  | ||||
|  | ||||
|  | ||||
|         // 判断并且处理应用分享到的文件 | ||||
|         // | ||||
|         //ToastUtils.show("Activity Opened."); | ||||
|  | ||||
|         // 预备接收参数 | ||||
|         // 处理分享的图片 | ||||
|         Intent intent = getIntent(); | ||||
|         String action = intent.getAction(); | ||||
|         String type = intent.getType(); | ||||
|  | ||||
|         //LogUtils.d(TAG, "action : " + action); | ||||
|         //LogUtils.d(TAG, "type : " + type); | ||||
|  | ||||
|         // 判断是否进入图片分享状态 | ||||
|         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))) { | ||||
|             // 预览图片 | ||||
|         if (Intent.ACTION_SEND.equals(action) && type != null && isImageType(type)) { | ||||
|             BackgroundPicturePreviewDialog dlg = new BackgroundPicturePreviewDialog(this); | ||||
|             dlg.show(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void initEnv() { | ||||
|     private void initEnv() { | ||||
|         LogUtils.d(TAG, "initEnv()"); | ||||
|         _RecivedPictureFileName = "Recived.data"; | ||||
|     } | ||||
| @@ -144,47 +140,55 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|  | ||||
|     @Override | ||||
|     public void onAcceptRecivedPicture(String szPreRecivedPictureName) { | ||||
|         //ToastUtils.show("onAcceptRecivedPicture"); | ||||
|         BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(this); | ||||
|         utils.getBackgroundPictureBean().setIsUseBackgroundFile(true); | ||||
|         utils.saveData(); | ||||
|         File fPreRecivedPictureName = new File(utils.getBackgroundDir(), szPreRecivedPictureName); | ||||
|         FileUtils.copyFile(fPreRecivedPictureName, mfRecivedPicture); | ||||
|         // 加载背景 | ||||
|  | ||||
|         File sourceFile = new File(utils.getBackgroundDir(), szPreRecivedPictureName); | ||||
|         if (FileUtils.copyFile(sourceFile, mfRecivedPicture)) { | ||||
|             startCropImageActivity(false); | ||||
|         } else { | ||||
|             ToastUtils.show("图片复制失败,请重试"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // | ||||
|     // 更新预览背景 | ||||
|     // | ||||
|     /** | ||||
|      * 更新背景图片预览 | ||||
|      */ | ||||
|     public void updatePreviewBackground() { | ||||
|         LogUtils.d(TAG, "updatePreviewBackground"); | ||||
|         ImageView ivPreviewBackground = findViewById(R.id.activitybackgroundpictureImageView1); | ||||
|         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 szBackgroundFilePath = utils.getBackgroundDir() + getBackgroundFileName(); | ||||
|                 Drawable drawableBackground = FileUtils.getImageDrawable(szBackgroundFilePath); | ||||
|                 drawableBackground.setAlpha(120); | ||||
|                 ivPreviewBackground.setImageDrawable(drawableBackground); | ||||
|                 ToastUtils.show("Use acceptRecived background."); | ||||
|                 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(" No background."); | ||||
|             Drawable drawableBackground = getDrawable(R.drawable.blank10x10); | ||||
|             drawableBackground.setAlpha(120); | ||||
|             ivPreviewBackground.setImageDrawable(drawableBackground); | ||||
|             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() { | ||||
|         @Override | ||||
|         public void onClick(View v) { | ||||
|             // 选择原始空白背景 | ||||
|             BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(BackgroundPictureActivity.this); | ||||
|             BackgroundPictureBean bean = utils.getBackgroundPictureBean(); | ||||
|             bean.setIsUseBackgroundFile(false); | ||||
| @@ -196,12 +200,11 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|     private View.OnClickListener onSelectPictureClickListener = new View.OnClickListener() { | ||||
|         @Override | ||||
|         public void onClick(View v) { | ||||
|             // 导入外部图片 | ||||
|             Intent intent = new Intent( | ||||
|                 Intent.ACTION_PICK, | ||||
|                 android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); | ||||
|             if (checkAndRequestStoragePermission()) { | ||||
|                 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); | ||||
|                 startActivityForResult(intent, REQUEST_SELECT_PICTURE); | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     private View.OnClickListener onCropPictureClickListener = new View.OnClickListener() { | ||||
| @@ -211,7 +214,7 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|             if (fCheck.exists()) { | ||||
|                 startCropImageActivity(false); | ||||
|             } else { | ||||
|                 ToastUtils.show("There is not any picture to crop."); | ||||
|                 ToastUtils.show("没有可剪裁的图片"); | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| @@ -223,7 +226,7 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|             if (fCheck.exists()) { | ||||
|                 startCropImageActivity(true); | ||||
|             } else { | ||||
|                 ToastUtils.show("There is not any picture to crop."); | ||||
|                 ToastUtils.show("没有可剪裁的图片"); | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| @@ -233,6 +236,7 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|         public void onClick(View v) { | ||||
|             LogUtils.d(TAG, "onTakePhotoClickListener"); | ||||
|             LogUtils.d(TAG, "mfTakePhoto : " + mfTakePhoto.getPath()); | ||||
|  | ||||
|             if (mfTakePhoto.exists()) { | ||||
|                 mfTakePhoto.delete(); | ||||
|             } | ||||
| @@ -240,16 +244,20 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|                 mfTakePhoto.createNewFile(); | ||||
|             } catch (IOException e) { | ||||
|                 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); | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     private View.OnClickListener onReceivedPictureClickListener = new View.OnClickListener() { | ||||
|         @Override | ||||
|         public void onClick(View v) { | ||||
|             // 选择接收到的背景图片 | ||||
|             BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(BackgroundPictureActivity.this); | ||||
|             utils.getBackgroundPictureBean().setIsUseBackgroundFile(true); | ||||
|             utils.saveData(); | ||||
| @@ -257,39 +265,73 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|         } | ||||
|     }; | ||||
|  | ||||
| 	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) { | ||||
|         // 设置输出流 | ||||
|         OutputStream outStream = null; | ||||
|         try { | ||||
|             // 创建输出流对象,准备写入压缩后的图片文件 | ||||
|             mfRecivedPicture = getRecivedPictureFile(this); | ||||
|             // 创建新的接收文件 | ||||
|             if (!mfRecivedPicture.exists()) { | ||||
|                 mfRecivedPicture.createNewFile(); | ||||
|             } | ||||
|  | ||||
|             FileOutputStream fos = new FileOutputStream(mfRecivedPicture); | ||||
|  | ||||
|             // 获取输出流对象 | ||||
|             outStream = new BufferedOutputStream(fos); | ||||
|  | ||||
|             // 使用默认的质量参数压缩图片 | ||||
|             bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); // 70% 的质量 | ||||
|  | ||||
|             // 关闭输出流以完成文件操作 | ||||
|             bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); | ||||
|             outStream.flush(); | ||||
|         } catch (IOException e) { | ||||
|             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) { | ||||
|         LogUtils.d(TAG, "startCropImageActivity"); | ||||
|         BackgroundPictureBean bean = mBackgroundPictureUtils.loadBackgroundPictureBean(); | ||||
|         mfRecivedPicture = getRecivedPictureFile(this); | ||||
|         Uri uri = UriUtil.getUriForFile(this, mfRecivedPicture); | ||||
|         LogUtils.d(TAG, "uri : " + uri.toString()); | ||||
|  | ||||
|         if (mfTempCropPicture.exists()) { | ||||
|             mfTempCropPicture.delete(); | ||||
|         } | ||||
| @@ -297,27 +339,24 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|             mfTempCropPicture.createNewFile(); | ||||
|         } catch (IOException e) { | ||||
|             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|             ToastUtils.show("剪裁临时文件创建失败"); | ||||
|             return; | ||||
|         } | ||||
|         // 使用正确的文件路径构建 Uri | ||||
|  | ||||
|         Uri cropOutPutUri = Uri.fromFile(mfTempCropPicture); | ||||
|         LogUtils.d(TAG, "mfTempCropPicture : " + mfTempCropPicture.getPath()); | ||||
|  | ||||
|         Intent intent = new Intent("com.android.camera.action.CROP"); | ||||
|         intent.setDataAndType(uri, "image/" + _mszCommonFileType); | ||||
|         // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 | ||||
|         intent.putExtra("crop", "true"); | ||||
|         intent.putExtra("noFaceDetection", true); | ||||
|  | ||||
|         if (!isCropFree) { | ||||
|             // aspectX aspectY 是宽高的比例 | ||||
|             intent.putExtra("aspectX", bean.getBackgroundWidth()); | ||||
|             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); | ||||
|         //裁剪后的图片输出至  cropOutPutUri | ||||
|         intent.putExtra(MediaStore.EXTRA_OUTPUT, cropOutPutUri); | ||||
|         intent.putExtra("scale", true); | ||||
|         intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); | ||||
| @@ -325,12 +364,101 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|         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() { | ||||
|         Uri uri = UriUtil.getUriForFile(this, mfRecivedPicture); | ||||
|         Intent shareIntent = new Intent();     | ||||
|         shareIntent.setAction(Intent.ACTION_SEND);     | ||||
|         Intent shareIntent = new Intent(Intent.ACTION_SEND); | ||||
|         shareIntent.putExtra(Intent.EXTRA_STREAM, uri); | ||||
|         shareIntent.setType("image/" + _mszCommonFileType); | ||||
|         shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); | ||||
| @@ -345,45 +473,121 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { | ||||
|  | ||||
|     @Override | ||||
|     protected void onActivityResult(int requestCode, int resultCode, Intent data) { | ||||
|  | ||||
|         super.onActivityResult(requestCode, resultCode, data); | ||||
|         if (requestCode == REQUEST_SELECT_PICTURE) { | ||||
|             // 处理选择后图片 | ||||
|             if (resultCode == RESULT_OK) { | ||||
|         if (requestCode == REQUEST_SELECT_PICTURE && resultCode == RESULT_OK) { | ||||
|             try { | ||||
|                 Uri selectedImage = data.getData(); | ||||
|                 LogUtils.d(TAG, "Uri is : " + selectedImage.toString()); | ||||
|                 File fSrcImage = new File(UriUtil.getFilePathFromUri(this, selectedImage)); | ||||
|                 mfRecivedPicture = getRecivedPictureFile(this); | ||||
|  | ||||
|                     FileUtils.copyFile(fSrcImage, mfRecivedPicture); | ||||
|                     // 启动剪裁文件窗口 | ||||
|                 if (FileUtils.copyFile(fSrcImage, mfRecivedPicture)) { | ||||
|                     startCropImageActivity(false); | ||||
|                 } else { | ||||
|                     ToastUtils.show("图片复制失败,请重试"); | ||||
|                 } | ||||
|             } catch (Exception e) { | ||||
|                     LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|                 LogUtils.e(TAG, "选择图片异常" + e); | ||||
|                 ToastUtils.show("选择图片失败:" + e.getMessage()); | ||||
|             } | ||||
|             } | ||||
|         } else if (requestCode == REQUEST_TAKE_PHOTO) { | ||||
|             if (resultCode == RESULT_OK) { | ||||
|         } else if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) { | ||||
|             LogUtils.d(TAG, "REQUEST_TAKE_PHOTO"); | ||||
|             Bundle extras = data.getExtras(); | ||||
|             if (extras != null) { | ||||
|                 Bitmap imageBitmap = (Bitmap) extras.get("data"); | ||||
|                 if (imageBitmap != null) { | ||||
|                     compressQualityToRecivedPicture(imageBitmap); | ||||
|                     startCropImageActivity(false); | ||||
|                 } else { | ||||
|                     ToastUtils.show("拍照图片为空"); | ||||
|                 } | ||||
|         } else if (requestCode == REQUEST_CROP_IMAGE) { | ||||
|             if (resultCode == RESULT_OK) { | ||||
|             } else { | ||||
|                 ToastUtils.show("拍照数据获取失败"); | ||||
|             } | ||||
|         } else if (requestCode == REQUEST_CROP_IMAGE && resultCode == RESULT_OK) { | ||||
|             LogUtils.d(TAG, "CROP_IMAGE_REQUEST_CODE"); | ||||
|                 FileUtils.copyFile(mfTempCropPicture, mfRecivedCropPicture); | ||||
|                 mfTempCropPicture.delete(); | ||||
|                 mBackgroundPictureUtils.getBackgroundPictureBean().setIsUseBackgroundFile(true); | ||||
|                 updatePreviewBackground(); | ||||
|             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; | ||||
|                 } | ||||
|  | ||||
|                 if (cropBitmap != null) { | ||||
|                     saveCropBitmap(cropBitmap); | ||||
|                 } else { | ||||
|             String sz = "Unsolved requestCode = " + Integer.toString(requestCode); | ||||
|             Toast.makeText(getApplication(), sz, Toast.LENGTH_SHORT).show(); | ||||
|             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 backgroundHeight = 100; | ||||
|     boolean isUseBackgroundFile = false; | ||||
| 	// 图片拾取像素颜色 | ||||
| 	int pixelColor = 0; | ||||
|  | ||||
|     public BackgroundPictureBean() { | ||||
|     } | ||||
| @@ -25,6 +27,14 @@ public class BackgroundPictureBean extends BaseBean { | ||||
|         this.isUseBackgroundFile = isUseBackgroundFile; | ||||
|     } | ||||
|  | ||||
| 	public void setPixelColor(int pixelColor) { | ||||
| 		this.pixelColor = pixelColor; | ||||
| 	} | ||||
|  | ||||
| 	public int getPixelColor() { | ||||
| 		return pixelColor; | ||||
| 	} | ||||
|  | ||||
|     public void setBackgroundWidth(int backgroundWidth) { | ||||
|         this.backgroundWidth = backgroundWidth; | ||||
|     } | ||||
| @@ -61,6 +71,7 @@ public class BackgroundPictureBean extends BaseBean { | ||||
|         jsonWriter.name("backgroundWidth").value(bean.getBackgroundWidth()); | ||||
|         jsonWriter.name("backgroundHeight").value(bean.getBackgroundHeight()); | ||||
|         jsonWriter.name("isUseBackgroundFile").value(bean.isUseBackgroundFile()); | ||||
| 		jsonWriter.name("pixelColor").value(bean.getPixelColor()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -75,6 +86,8 @@ public class BackgroundPictureBean extends BaseBean { | ||||
|                 bean.setBackgroundHeight(jsonReader.nextInt()); | ||||
|             } else if (name.equals("isUseBackgroundFile")) { | ||||
|                 bean.setIsUseBackgroundFile(jsonReader.nextBoolean()); | ||||
|             } else if (name.equals("pixelColor")) { | ||||
|                 bean.setPixelColor(jsonReader.nextInt()); | ||||
|             } else { | ||||
|                 jsonReader.skipValue(); | ||||
|             } | ||||
|   | ||||
| @@ -311,11 +311,11 @@ public class MainViewFragment extends Fragment { | ||||
|         LogUtils.d(TAG, String.format("fBackgroundFilePath.exists() %s", fBackgroundFilePath.exists())); | ||||
|         if (bean.isUseBackgroundFile() && fBackgroundFilePath.exists()) { | ||||
|             Drawable drawableBackground = Drawable.createFromPath(szBackgroundFilePath); | ||||
|             drawableBackground.setAlpha(120); | ||||
|             //drawableBackground.setAlpha(120); | ||||
|             imageView.setImageDrawable(drawableBackground); | ||||
|         } else { | ||||
|             Drawable drawableBackground = getActivity().getDrawable(R.drawable.blank10x10); | ||||
|             drawableBackground.setAlpha(120); | ||||
|             //drawableBackground.setAlpha(120); | ||||
|             imageView.setImageDrawable(drawableBackground); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <RelativeLayout | ||||
| <LinearLayout | ||||
| 	xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| 	xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
| 	android:orientation="vertical" | ||||
| @@ -12,6 +12,16 @@ | ||||
| 		android:id="@+id/toolbar" | ||||
| 		style="@style/DefaultAToolbar"/> | ||||
|  | ||||
| 	<RelativeLayout | ||||
| 		android:layout_width="wrap_content" | ||||
| 		android:layout_height="wrap_content"> | ||||
|  | ||||
| 		<RelativeLayout | ||||
| 			android:layout_width="match_parent" | ||||
| 			android:layout_height="match_parent" | ||||
| 			android:id="@+id/activitybackgroundpictureRelativeLayout1"/> | ||||
|  | ||||
|  | ||||
| 		<ImageView | ||||
| 			android:layout_width="match_parent" | ||||
| 			android:layout_height="match_parent" | ||||
| @@ -59,7 +69,7 @@ | ||||
| 					android:layout_height="36dp" | ||||
| 					android:text="◎" | ||||
| 					android:layout_gravity="center_vertical" | ||||
| 				android:layout_margin="10dp" | ||||
| 					android:layout_margin="5dp" | ||||
| 					android:id="@+id/activitybackgroundpictureAButton1"/> | ||||
|  | ||||
| 				<cc.winboll.studio.libaes.views.AButton | ||||
| @@ -67,7 +77,7 @@ | ||||
| 					android:layout_height="36dp" | ||||
| 					android:text="☑" | ||||
| 					android:layout_gravity="center_vertical" | ||||
| 				android:layout_margin="10dp" | ||||
| 					android:layout_margin="5dp" | ||||
| 					android:id="@+id/activitybackgroundpictureAButton2"/> | ||||
|  | ||||
| 				<cc.winboll.studio.libaes.views.AButton | ||||
| @@ -75,7 +85,7 @@ | ||||
| 					android:layout_height="36dp" | ||||
| 					android:text="[+]" | ||||
| 					android:layout_gravity="center_vertical" | ||||
| 				android:layout_margin="10dp" | ||||
| 					android:layout_margin="5dp" | ||||
| 					android:id="@+id/activitybackgroundpictureAButton3"/> | ||||
|  | ||||
| 				<cc.winboll.studio.libaes.views.AButton | ||||
| @@ -83,12 +93,29 @@ | ||||
| 					android:layout_height="36dp" | ||||
| 					android:text="[+~]" | ||||
| 					android:layout_gravity="center_vertical" | ||||
| 				android:layout_margin="10dp" | ||||
| 					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> | ||||
|  | ||||
| 	</RelativeLayout> | ||||
| </LinearLayout> | ||||
|  | ||||
|   | ||||
| @@ -25,12 +25,19 @@ | ||||
|  | ||||
| 	</LinearLayout> | ||||
|  | ||||
| 	<LinearLayout | ||||
| 		android:orientation="horizontal" | ||||
| 		android:layout_width="match_parent" | ||||
| 		android:layout_height="wrap_content" | ||||
| 		android:gravity="center_horizontal"> | ||||
|  | ||||
| 		<TextView | ||||
| 			android:layout_width="wrap_content" | ||||
| 			android:layout_height="wrap_content" | ||||
| 			android:id="@+id/activityclearrecordTextView1" | ||||
| 		android:gravity="center_horizontal" | ||||
| 		android:layout_gravity="center_horizontal"/> | ||||
| 			android:textAppearance="?android:attr/textAppearanceSmall"/> | ||||
|  | ||||
| 	</LinearLayout> | ||||
|  | ||||
| 	<LinearLayout | ||||
| 		android:orientation="vertical" | ||||
|   | ||||
| @@ -6,11 +6,6 @@ | ||||
| 	android:layout_height="match_parent" | ||||
| 	android:orientation="vertical"> | ||||
|  | ||||
| 	<LinearLayout | ||||
| 		android:orientation="horizontal" | ||||
| 		android:layout_width="match_parent" | ||||
| 		android:layout_height="wrap_content"> | ||||
|  | ||||
| 	<cc.winboll.studio.libaes.views.AToolbar | ||||
| 		android:layout_width="match_parent" | ||||
| 		android:layout_height="@dimen/toolbar_height" | ||||
| @@ -18,26 +13,23 @@ | ||||
| 		android:gravity="center_vertical" | ||||
| 		style="@style/DefaultAToolbar"/> | ||||
|  | ||||
| 	</LinearLayout> | ||||
|  | ||||
| 	<LinearLayout | ||||
| 		android:orientation="vertical" | ||||
| 	<RelativeLayout | ||||
| 		android:layout_width="match_parent" | ||||
| 		android:layout_height="wrap_content" | ||||
| 		android:layout_height="0dp" | ||||
| 		android:layout_weight="1.0"> | ||||
|  | ||||
| 		<RelativeLayout | ||||
| 			android:layout_width="match_parent" | ||||
| 			android:layout_height="match_parent" | ||||
| 			android:id="@+id/activitymainRelativeLayout1" | ||||
| 			android:background="#FFEE2121"/> | ||||
|  | ||||
| 		<FrameLayout | ||||
| 			android:layout_width="match_parent" | ||||
| 			android:layout_height="match_parent" | ||||
| 			android:id="@+id/activitymainFrameLayout1"/> | ||||
|  | ||||
| 	</LinearLayout> | ||||
|  | ||||
| 	<cc.winboll.studio.libappbase.LogView | ||||
| 		android:orientation="horizontal" | ||||
| 		android:layout_width="match_parent" | ||||
| 		android:layout_height="200dp" | ||||
| 		android:id="@+id/logview"/> | ||||
| 	</RelativeLayout> | ||||
|  | ||||
| </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> | ||||
|  | ||||
| 			<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 | ||||
| @@ -205,6 +196,21 @@ | ||||
|  | ||||
| 		</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> | ||||
|  | ||||
| </RelativeLayout> | ||||
|   | ||||
| @@ -9,6 +9,9 @@ | ||||
|     <item | ||||
|         android:id="@+id/action_changepicture" | ||||
|         android:title="@string/item_changepicture"/> | ||||
|     <item | ||||
|         android:id="@+id/action_log" | ||||
|         android:title="@string/item_logview"/> | ||||
|     <item | ||||
|         android:id="@+id/action_about" | ||||
|         android:title="@string/item_aboutview"/> | ||||
|   | ||||
| @@ -15,6 +15,7 @@ | ||||
|     <string name="texthint_CustomSlideToCleanRecord">Slide Right To Clean Up APP Record.</string> | ||||
|     <string name="subtitle_activity_clearrecord">清理记录</string> | ||||
|     <string name="subtitle_activity_backgroundpicture">更换背景图片</string> | ||||
|     <string name="subtitle_activity_pixelpicker">背景像素拾取</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> | ||||
|   | ||||
| @@ -18,6 +18,7 @@ | ||||
|     <string name="texthint_CustomSlideToCleanRecord">Slide Right To Clean Up APP Record.</string> | ||||
|     <string name="subtitle_activity_clearrecord">Clean Record</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="msg_AOHPCTCSeekBar_ClearRecord">>>>Seek 100% To Clear Battery Record.>>></string> | ||||
|     <string name="msg_AOHPCTCSeekBar_ClearRecord">>>>Seek 100% Right Is Clean Record.>>></string> | ||||
| </resources> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ZhanGSKen
					ZhanGSKen