diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index b2482641..315fd3e7 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -27,6 +27,7 @@ "应用内页面导航栏设置为透明或半透明以增强视觉体验", "UI 模式状态栏及导航栏默认为 `md_grey_50` 色值且设置为亮色模式", "长按应用主页 \"文件\" 标签可切换浮动按钮可见状态", + "代码编辑器标题文字支持字体大小自适应", "日志页面浮动按钮可见状态与列表滚动操作联动", "脚本项目配置文件 project.json 支持更多打包选项 _[`issue #305`](http://issues.autojs6.com/305)_ _[`issue #306`](http://issues.autojs6.com/306)_", "脚本项目配置文件 project.json 支持选项名称宽松匹配及别名兼容", diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt index c47d0e20..52f11b11 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt @@ -6,10 +6,16 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle +import android.text.Layout +import android.text.StaticLayout +import android.text.TextPaint import android.util.Log +import android.util.TypedValue import android.view.ActionMode import android.view.Menu import android.view.MenuItem +import android.view.ViewTreeObserver +import android.widget.TextView import androidx.appcompat.widget.Toolbar import com.afollestad.materialdialogs.MaterialDialog import io.reactivex.Observable @@ -22,10 +28,11 @@ import org.autojs.autojs.core.permission.PermissionRequestProxyActivity import org.autojs.autojs.core.permission.RequestPermissionCallbacks import org.autojs.autojs.pio.PFiles import org.autojs.autojs.storage.file.TmpScriptFiles +import org.autojs.autojs.theme.widget.ThemeColorToolbar import org.autojs.autojs.ui.BaseActivity import org.autojs.autojs.ui.main.MainActivity import org.autojs.autojs.util.Observers -import org.autojs.autojs.util.ViewUtils +import org.autojs.autojs.util.ViewUtils.setMenuIconsColorByThemeColorLuminance import org.autojs.autojs6.R import org.autojs.autojs6.databinding.ActivityEditBinding import java.io.File @@ -37,7 +44,7 @@ import java.io.IOException */ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyActivity { - private var mToolbar: Toolbar? = null + private var mToolbar: ThemeColorToolbar? = null private val mMediator = OnActivityResultDelegate.Mediator() private lateinit var mEditorView: EditorView @@ -51,7 +58,9 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc super.onCreate(savedInstanceState) val binding = ActivityEditBinding.inflate(layoutInflater).also { setContentView(it.root) } - mToolbar = findViewById(R.id.toolbar) + mToolbar = findViewById(R.id.toolbar).apply { + setTitleTextAppearance(this@EditActivity, R.style.TextAppearanceEditorTitle) + } mEditorView = binding.editorView.apply { handleIntent(intent) .observeOn(AndroidSchedulers.mainThread()) @@ -62,12 +71,97 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc setUpToolbar() } - override fun onWindowStartingActionMode(callback: ActionMode.Callback): ActionMode? { - return super.onWindowStartingActionMode(callback) - } + // @Created by JetBrains AI Assistant on Mar 24, 2025. + private fun adjustTitleTextView(textView: TextView) { + textView.post { + // 可用宽度, 排除内边距 + val availableWidth = textView.width - textView.paddingLeft - textView.paddingRight + if (availableWidth <= 0) return@post - override fun onWindowStartingActionMode(callback: ActionMode.Callback, type: Int): ActionMode? { - return super.onWindowStartingActionMode(callback, type) + val textStr = textView.text.toString() + val isNonAscii = textStr.any { it.code >= 0x80 } + val paint: TextPaint = textView.paint + val originTextSizePx = textView.textSize + val step = resources.getDimension(R.dimen.editor_title_text_size_step) + + /* ---------- 尝试一行显示 (单行) ---------- */ + + textView.isSingleLine = true + textView.maxLines = 1 + + var oneLineTextSizePx = originTextSizePx + val minOneLineSizePx = resources.getDimension(R.dimen.editor_title_min_text_size_single_line) + + // 测量一行文字宽度 + paint.textSize = oneLineTextSizePx + var measuredWidth = paint.measureText(textStr) + // 当文字宽度超出可用宽度并且字号还高于下限的时候逐步降低字号 + while (measuredWidth > availableWidth && oneLineTextSizePx > minOneLineSizePx) { + oneLineTextSizePx -= step + paint.textSize = oneLineTextSizePx + measuredWidth = paint.measureText(textStr) + } + + // 如果一行能够显示文字, 则直接应用修改 + if (measuredWidth <= availableWidth) { + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, oneLineTextSizePx) + return@post + } + + /* ---------- 切换为两行显示 ---------- */ + + textView.isSingleLine = false + textView.maxLines = 2 + + // 重置字号 + var twoLineTextSize = when (isNonAscii) { + true -> resources.getDimension(R.dimen.editor_title_text_size_double_line_non_ascii) + else -> resources.getDimension(R.dimen.editor_title_text_size_double_line_ascii) + } + + val minTwoLineSize = resources.getDimension(R.dimen.editor_title_min_text_size_double_line) + paint.textSize = twoLineTextSize + + // 检查两行显示是否足够: 利用 StaticLayout 测量文字显示效果 + fun createStaticLayout(textSize: Float): StaticLayout { + paint.textSize = textSize + return StaticLayout.Builder + .obtain(textStr, 0, textStr.length, paint, availableWidth) + .setAlignment(Layout.Alignment.ALIGN_NORMAL) + .setLineSpacing(0f, 1f) + .build() + } + + var layout = createStaticLayout(twoLineTextSize) + // 当行数超出了两行且字号尚未到达最低要求, 则逐步降低字号 + while (layout.lineCount > 2 && twoLineTextSize > minTwoLineSize) { + twoLineTextSize -= step + layout = createStaticLayout(twoLineTextSize) + } + if (layout.lineCount <= 2) { + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, twoLineTextSize) + return@post + } + + /* ---------- 切换为三行显示 ---------- */ + + textView.maxLines = 3 + + var threeLineSize = when (isNonAscii) { + true -> resources.getDimension(R.dimen.editor_title_text_size_triple_line_non_ascii) + else -> resources.getDimension(R.dimen.editor_title_text_size_triple_line_ascii) + } + + val minThreeLineSize = resources.getDimension(R.dimen.editor_title_min_text_size_triple_line) + + paint.textSize = threeLineSize + layout = createStaticLayout(threeLineSize) + while (layout.lineCount > 3 && threeLineSize > minThreeLineSize) { + threeLineSize -= step + layout = createStaticLayout(threeLineSize) + } + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, threeLineSize) + } } private fun onLoadFileError(message: String?) { @@ -86,7 +180,18 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_editor, menu) - ViewUtils.setToolbarMenuIconsColorByThemeColorLuminance(this, mToolbar) + mToolbar?.let { toolbar -> + toolbar.setMenuIconsColorByThemeColorLuminance(this) + toolbar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + val titleView = toolbar.findViewById(com.google.android.material.R.id.action_bar_title) ?: run { + Toolbar::class.java.getDeclaredField("mTitleTextView").apply { isAccessible = true }.get(toolbar) as TextView? + } + titleView?.let { adjustTitleTextView(it) } + toolbar.viewTreeObserver.removeOnGlobalLayoutListener(this) + } + }) + } return true } @@ -94,16 +199,6 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc return mEditorMenu.onOptionsItemSelected(item) } - override fun onPrepareOptionsMenu(menu: Menu): Boolean { - Log.d(LOG_TAG, "onPrepareOptionsMenu: $menu") - - // val isScriptRunning = mEditorView.scriptExecutionId != ScriptExecution.NO_ID - // val forceStopItem = menu.findItem(R.id.action_force_stop) - // forceStopItem.isEnabled = isScriptRunning - - return super.onPrepareOptionsMenu(menu) - } - override fun onActionModeStarted(mode: ActionMode) { Log.d(LOG_TAG, "onActionModeStarted: $mode") diff --git a/app/src/main/res/layout/activity_log.xml b/app/src/main/res/layout/activity_log.xml index 4323f5ac..6aba33f3 100644 --- a/app/src/main/res/layout/activity_log.xml +++ b/app/src/main/res/layout/activity_log.xml @@ -1,5 +1,6 @@ - diff --git a/app/src/main/res/layout/fragment_debug_toolbar.xml b/app/src/main/res/layout/fragment_debug_toolbar.xml index fc775a0f..3e7a5b91 100644 --- a/app/src/main/res/layout/fragment_debug_toolbar.xml +++ b/app/src/main/res/layout/fragment_debug_toolbar.xml @@ -1,44 +1,45 @@ - + + app:text="@string/text_debug_step_over" /> + app:text="@string/text_debug_step_into" /> + app:text="@string/text_debug_step_out" /> + app:text="@string/text_debug_resume_script" /> + app:text="@string/text_stop" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_normal_toolbar.xml b/app/src/main/res/layout/fragment_normal_toolbar.xml index 1b181b74..48ef6ca0 100644 --- a/app/src/main/res/layout/fragment_normal_toolbar.xml +++ b/app/src/main/res/layout/fragment_normal_toolbar.xml @@ -1,38 +1,39 @@ - + + android:id="@+id/run" + android:layout_width="@dimen/toolbar_menu_item_width" + android:layout_height="match_parent" + app:icon="@drawable/ic_play_arrow_white_48dp" + app:text="@string/text_run_simplified" /> + android:id="@+id/undo" + android:layout_width="@dimen/toolbar_menu_item_width" + android:layout_height="match_parent" + app:icon="@drawable/ic_undo_white_48dp" + app:text="@string/text_undo_simplified" /> + android:id="@+id/redo" + android:layout_width="@dimen/toolbar_menu_item_width" + android:layout_height="match_parent" + app:icon="@drawable/ic_redo_white_48dp" + app:text="@string/text_redo_simplified" /> + android:id="@+id/save" + android:layout_width="@dimen/toolbar_menu_item_width" + android:layout_height="match_parent" + android:enabled="false" + app:icon="@drawable/ic_save_white_48dp" + app:text="@string/text_save_simplified" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search_toolbar.xml b/app/src/main/res/layout/fragment_search_toolbar.xml index aa860566..1c1e0f70 100644 --- a/app/src/main/res/layout/fragment_search_toolbar.xml +++ b/app/src/main/res/layout/fragment_search_toolbar.xml @@ -1,37 +1,38 @@ - + + app:text="@string/text_replace_simplified" /> + app:text="@string/text_find_prev_simplified" /> + app:text="@string/text_find_next_simplified" /> + app:text="@string/text_cancel_simplified" /> \ No newline at end of file diff --git a/app/src/main/res/layout/toolbar_menu_item.xml b/app/src/main/res/layout/toolbar_menu_item.xml index 5e895c00..f3910e28 100644 --- a/app/src/main/res/layout/toolbar_menu_item.xml +++ b/app/src/main/res/layout/toolbar_menu_item.xml @@ -1,29 +1,32 @@ - + + android:id="@+id/icon" + android:layout_width="match_parent" + android:layout_height="?android:attr/actionBarSize" + android:paddingBottom="23dp" + android:paddingTop="5dp" + tools:src="@drawable/autojs6_material" /> + android:id="@+id/text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="-23dp" + android:gravity="center" + android:maxLines="1" + android:ellipsize="end" + android:textSize="12sp" + tools:textColor="@color/day_night" + tools:text="@string/text_sample_string" /> \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 1df020ae..4c9acf17 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -23,7 +23,15 @@ 12dp 14dp 14sp - 18sp + 19sp + 19sp + 16sp + 13sp + 11sp + 16sp + 13sp + 11sp + 1sp 20sp 14sp 2dp @@ -51,5 +59,6 @@ 12dp 16sp 48dp + 40dp