[3.3.0][魔方] 功能代码提交
This commit is contained in:
@@ -172,9 +172,9 @@ internal class WarningFloatWindowHelper(
|
||||
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
|
||||
|
||||
addListener(object : Animator.AnimatorListener {
|
||||
override fun onAnimationRepeat(animation: Animator?) {}
|
||||
override fun onAnimationRepeat(animation: Animator) {}
|
||||
|
||||
override fun onAnimationEnd(animation: Animator?) {
|
||||
override fun onAnimationEnd(animation: Animator) {
|
||||
config.isAnim = false
|
||||
if (!config.immersionStatusBar) {
|
||||
// 不需要延伸到屏幕外了,防止屏幕旋转的时候,浮窗处于屏幕外
|
||||
@@ -183,9 +183,9 @@ internal class WarningFloatWindowHelper(
|
||||
}
|
||||
}
|
||||
|
||||
override fun onAnimationCancel(animation: Animator?) {}
|
||||
override fun onAnimationCancel(animation: Animator) {}
|
||||
|
||||
override fun onAnimationStart(animation: Animator?) {
|
||||
override fun onAnimationStart(animation: Animator) {
|
||||
floatingView.visibility = View.VISIBLE
|
||||
config.isAnim = true
|
||||
}
|
||||
@@ -216,13 +216,13 @@ internal class WarningFloatWindowHelper(
|
||||
params.flags =
|
||||
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
|
||||
animator.addListener(object : Animator.AnimatorListener {
|
||||
override fun onAnimationRepeat(animation: Animator?) {}
|
||||
override fun onAnimationRepeat(animation: Animator) {}
|
||||
|
||||
override fun onAnimationEnd(animation: Animator?) = remove()
|
||||
override fun onAnimationEnd(animation: Animator) = remove()
|
||||
|
||||
override fun onAnimationCancel(animation: Animator?) {}
|
||||
override fun onAnimationCancel(animation: Animator) {}
|
||||
|
||||
override fun onAnimationStart(animation: Animator?) {}
|
||||
override fun onAnimationStart(animation: Animator) {}
|
||||
})
|
||||
animator.start()
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ abstract class AbsLogView : ILogView, TouchProxy.OnTouchEventListener {
|
||||
}
|
||||
systemLayoutParams?.apply {
|
||||
format = PixelFormat.TRANSPARENT
|
||||
gravity = GravityCompat.START or Gravity.TOP
|
||||
gravity = Gravity.START or Gravity.TOP
|
||||
}
|
||||
mLogViewLayoutParams.gravity = GravityCompat.START or Gravity.TOP
|
||||
//动态注册关闭系统弹窗的广播
|
||||
@@ -352,7 +352,7 @@ abstract class AbsLogView : ILogView, TouchProxy.OnTouchEventListener {
|
||||
mWindowManager.updateViewLayout(mRootView, layoutAttrs)
|
||||
}
|
||||
addListener(object : AnimatorListenerAdapter() {
|
||||
override fun onAnimationEnd(animation: Animator?) {
|
||||
override fun onAnimationEnd(animation: Animator) {
|
||||
endMoveAndRecord()
|
||||
}
|
||||
})
|
||||
|
||||
@@ -86,7 +86,7 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas
|
||||
@Volatile
|
||||
private var data: LookAroundData? = null
|
||||
|
||||
override fun surfaceCreated(holder: SurfaceHolder?) {
|
||||
override fun surfaceCreated(holder: SurfaceHolder) {
|
||||
val old = handler.get()
|
||||
if (old == null) {
|
||||
handler.set(HandlerThread("look-around-drawer").let { it.start(); Handler(it.looper) })
|
||||
@@ -99,12 +99,12 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas
|
||||
isSurfaceValid = true
|
||||
}
|
||||
|
||||
override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) {
|
||||
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
|
||||
this.surfaceWidth = width
|
||||
this.surfaceHeight = height
|
||||
}
|
||||
|
||||
override fun surfaceDestroyed(holder: SurfaceHolder?) {
|
||||
override fun surfaceDestroyed(holder: SurfaceHolder) {
|
||||
isSurfaceValid = false
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.widget.*
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig
|
||||
import com.mogo.eagle.core.data.config.HmiBuildConfig
|
||||
@@ -11,11 +12,12 @@ import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig
|
||||
import com.mogo.eagle.core.data.multidisplay.TelematicConstant
|
||||
import com.mogo.eagle.core.data.obu.MogoObuConst
|
||||
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener
|
||||
import com.mogo.eagle.core.function.api.devatools.mofang.*
|
||||
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
|
||||
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO
|
||||
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN
|
||||
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
|
||||
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager
|
||||
import com.mogo.eagle.core.function.call.devatools.*
|
||||
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
|
||||
import com.mogo.eagle.core.function.call.obu.CallerObuApiManager
|
||||
import com.mogo.eagle.core.function.hmi.R
|
||||
@@ -37,7 +39,7 @@ internal class SOPSettingView @JvmOverloads constructor(
|
||||
attrs: AttributeSet? = null,
|
||||
defStyleAttr: Int = 0
|
||||
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoDevaToolsFuncConfigListener,
|
||||
IViewControlListener {
|
||||
IViewControlListener, IMoGoMoFangProvider.OnMoFangStatusListener {
|
||||
|
||||
companion object {
|
||||
const val TAG = "SOPSettingView"
|
||||
@@ -284,6 +286,39 @@ internal class SOPSettingView @JvmOverloads constructor(
|
||||
btnSpeedSet.visibility = View.GONE
|
||||
}
|
||||
|
||||
|
||||
mfStatusLayout.setClickEnabled(false)
|
||||
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
|
||||
val mf = CallerDevaToolsManager.mofang()
|
||||
if (mf != null) {
|
||||
mfStatusLayout.setClickEnabled(true)
|
||||
mfStatusLayout.setClickedTextAndTag(if (mf.isConnected()) "断开魔方连接" else "开始连接魔方", if (mf.isConnected()) 0 else 1)
|
||||
mf.registerMoFangStatusListener(TAG, this)
|
||||
mfStatusLayout.setOnClickCallback {
|
||||
val tag = it.tag as? Int
|
||||
if (tag == 0) {
|
||||
//断开魔方连接
|
||||
if (!mf.isConnected()) {
|
||||
Toast.makeText(context, "尚未建立连接", Toast.LENGTH_SHORT).show()
|
||||
return@setOnClickCallback
|
||||
}
|
||||
mfStatusLayout.showLoadingView()
|
||||
mfStatusLayout.setLoadingViewText("正在断开魔方连接, 请稍候...")
|
||||
mf.disconnect()
|
||||
}
|
||||
if (tag == 1) {
|
||||
//建立魔方连接
|
||||
if (mf.isConnected()) {
|
||||
Toast.makeText(context, "已连接,不要重复连接", Toast.LENGTH_SHORT).show()
|
||||
return@setOnClickCallback
|
||||
}
|
||||
mf.connect()
|
||||
mfStatusLayout.showLoadingView()
|
||||
mfStatusLayout.setLoadingViewText("正在连接魔方, 请稍候")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
@@ -317,6 +352,8 @@ internal class SOPSettingView @JvmOverloads constructor(
|
||||
// } catch (e: Exception) {
|
||||
// e.printStackTrace()
|
||||
// }
|
||||
|
||||
CallerDevaToolsManager.mofang()?.unRegisterMoFangStatusListener(this)
|
||||
}
|
||||
|
||||
// private val timerTaskRefresh = object : TimerTask(){
|
||||
@@ -357,4 +394,30 @@ internal class SOPSettingView @JvmOverloads constructor(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override fun onMoFangConnected() {
|
||||
mfStatusLayout?.also {
|
||||
it.hideLoadingView()
|
||||
it.setClickedTextAndTag("断开魔方连接", 0)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onMoFangDisconnected() {
|
||||
mfStatusLayout?.also {
|
||||
it.hideLoadingView()
|
||||
it.setClickedTextAndTag("开始连接魔方", 1)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onMoFangBatteryChanged(battery: Int) {
|
||||
}
|
||||
|
||||
override fun onMoFangClicked(keyCode: Int) {}
|
||||
|
||||
override fun onMoFangLongClicked(keyCode: Int) {}
|
||||
|
||||
override fun onMoFangCombineClicked(vararg keyCodes: Int) {}
|
||||
|
||||
override fun onMoFangStatusError(msg: String) {}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
package com.mogo.eagle.core.function.hmi.ui.setting
|
||||
|
||||
import android.content.*
|
||||
import android.graphics.*
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.util.*
|
||||
import android.view.*
|
||||
import android.widget.*
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import com.mogo.eagle.core.function.hmi.*
|
||||
import com.mogo.eagle.core.utilcode.kotlin.*
|
||||
|
||||
class StateViewLayout: ConstraintLayout {
|
||||
|
||||
constructor(context: Context) : this(context, null)
|
||||
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(context, attrs, defStyleAttr, 0)
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {
|
||||
LayoutInflater.from(context).inflate(R.layout.view_status_layout, this, true)
|
||||
background = ColorDrawable(Color.GRAY)
|
||||
}
|
||||
|
||||
private val loadingView by lazy { findViewById<View>(R.id.loading_view) }
|
||||
|
||||
private val loadingTextView by lazy { findViewById<TextView>(R.id.loading_text) }
|
||||
|
||||
private val clicked by lazy { findViewById<Button>(R.id.clicked) }
|
||||
|
||||
|
||||
fun showLoadingView() {
|
||||
clicked.visibility = View.INVISIBLE
|
||||
loadingView.visibility = View.VISIBLE
|
||||
}
|
||||
|
||||
fun hideLoadingView() {
|
||||
clicked.visibility = View.VISIBLE
|
||||
loadingView.visibility = View.INVISIBLE
|
||||
}
|
||||
|
||||
fun setLoadingViewText(text: String) {
|
||||
loadingTextView.text = text
|
||||
}
|
||||
|
||||
fun setClickedTextAndTag(text: String, tag: Int) {
|
||||
clicked.text = text
|
||||
clicked.tag = tag
|
||||
}
|
||||
|
||||
fun setOnClickCallback(block: ((v: View) -> Unit)?) {
|
||||
clicked.onClick {
|
||||
block?.invoke(it)
|
||||
}
|
||||
}
|
||||
|
||||
fun setClickEnabled(enabled: Boolean) {
|
||||
clicked.isEnabled = enabled
|
||||
}
|
||||
}
|
||||
@@ -1,59 +1,72 @@
|
||||
package com.mogo.eagle.core.function.hmi.ui.widget
|
||||
|
||||
import android.annotation.*
|
||||
import android.content.Context
|
||||
import android.graphics.*
|
||||
import android.graphics.drawable.*
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.widget.RelativeLayout
|
||||
import com.mogo.eagle.core.data.deva.mofang.MfConstants
|
||||
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
|
||||
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
|
||||
import android.view.*
|
||||
import android.widget.LinearLayout
|
||||
import com.mogo.eagle.core.function.api.devatools.mofang.*
|
||||
import com.mogo.eagle.core.function.call.devatools.*
|
||||
import com.mogo.eagle.core.function.hmi.R
|
||||
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
|
||||
import com.mogo.eagle.core.utilcode.util.ThreadUtils
|
||||
import kotlinx.android.synthetic.main.view_blue_tooth.view.*
|
||||
|
||||
/**
|
||||
* 魔戒蓝牙控件
|
||||
* 放置于StatusBar右侧位置
|
||||
*/
|
||||
open class BlueToothView @JvmOverloads constructor(
|
||||
context: Context,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyleAttr: Int = 0
|
||||
) : RelativeLayout(context, attrs, defStyleAttr),IMoGoDevaToolsListener {
|
||||
open class BlueToothView: LinearLayout, IMoGoMoFangProvider.OnMoFangStatusListener {
|
||||
|
||||
constructor(context: Context) : this(context, null)
|
||||
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(context, attrs, defStyleAttr, 0)
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {
|
||||
orientation = HORIZONTAL
|
||||
LayoutInflater.from(context).inflate(R.layout.view_blue_tooth
|
||||
, this, true)
|
||||
visibility = View.GONE
|
||||
}
|
||||
|
||||
companion object{
|
||||
private const val TAG = "BlueToothView"
|
||||
}
|
||||
|
||||
init {
|
||||
LayoutInflater.from(context).inflate(R.layout.view_blue_tooth, this, true)
|
||||
}
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
val isBluetoothConnect =
|
||||
SharedPrefsMgr.getInstance(context).getBoolean(MfConstants.BLUETOOTH_STATUS, false)
|
||||
if (isBluetoothConnect) {
|
||||
mofangStatus(true)
|
||||
}
|
||||
CallerDevaToolsListenerManager.addListener(TAG, this)
|
||||
}
|
||||
|
||||
override fun mofangStatus(status: Boolean) {
|
||||
super.mofangStatus(status)
|
||||
ThreadUtils.runOnUiThread {
|
||||
if (status) {
|
||||
mofangView.setImageResource(R.drawable.icon_bluetooth_p)
|
||||
} else {
|
||||
mofangView.setImageResource(R.drawable.blue_tooth)
|
||||
}
|
||||
}
|
||||
val isConnected = CallerDevaToolsManager.mofang()?.isConnected() ?: false
|
||||
visibility = if (isConnected) View.VISIBLE else View.GONE
|
||||
CallerDevaToolsManager.mofang()?.registerMoFangStatusListener(TAG, this)
|
||||
}
|
||||
|
||||
override fun onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow()
|
||||
CallerDevaToolsListenerManager.removeListener(TAG)
|
||||
CallerDevaToolsManager.mofang()?.unRegisterMoFangStatusListener(this)
|
||||
}
|
||||
|
||||
override fun onMoFangConnected() {
|
||||
visibility = View.VISIBLE
|
||||
}
|
||||
|
||||
override fun onMoFangDisconnected() {
|
||||
visibility = View.GONE
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
override fun onMoFangBatteryChanged(battery: Int) {
|
||||
ivMoFangBattery?.also {
|
||||
if (it.visibility != View.VISIBLE) {
|
||||
it.visibility = View.VISIBLE
|
||||
}
|
||||
it.text = "${battery}%"
|
||||
}
|
||||
}
|
||||
|
||||
override fun onMoFangClicked(keyCode: Int) {}
|
||||
|
||||
override fun onMoFangLongClicked(keyCode: Int) {}
|
||||
|
||||
override fun onMoFangCombineClicked(vararg keyCodes: Int) {}
|
||||
|
||||
override fun onMoFangStatusError(msg: String) {}
|
||||
}
|
||||
@@ -11,6 +11,7 @@ import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Process;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.KeyEvent;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -22,7 +23,6 @@ import com.mogo.commons.module.intent.IntentManager;
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
|
||||
import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider;
|
||||
import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener;
|
||||
import com.mogo.eagle.core.function.call.mofang.CallerMofangListenerManager;
|
||||
import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager;
|
||||
import com.mogo.eagle.core.function.hmi.R;
|
||||
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
|
||||
@@ -30,10 +30,8 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
|
||||
import com.mogo.eagle.core.utilcode.util.ToastUtils;
|
||||
import com.rousetime.android_startup.model.CostTimesModel;
|
||||
import com.zhjt.service.chain.ChainLog;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -202,21 +200,6 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis
|
||||
super.onBackPressed();
|
||||
}
|
||||
|
||||
/**
|
||||
* 魔方按键分发
|
||||
*
|
||||
* @param event
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean dispatchKeyEvent(KeyEvent event) {
|
||||
if(CallerMofangListenerManager.INSTANCE.invokeMofangHandle(event.getKeyCode(), event.getAction())) {
|
||||
return true;
|
||||
} else {
|
||||
return super.dispatchKeyEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSkinModeChange(int skinMode) {
|
||||
}
|
||||
|
||||
@@ -1,15 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="@dimen/dp_54"
|
||||
android:layout_height="@dimen/dp_54">
|
||||
tools:layout_width="wrap_content"
|
||||
tools:layout_height="@dimen/dp_54"
|
||||
tools:parentTag="android.widget.LinearLayout"
|
||||
tools:orientation="horizontal"
|
||||
tools:background="@color/black">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/mofangView"
|
||||
android:id="@+id/ivMoFangStatus"
|
||||
android:layout_width="@dimen/dp_54"
|
||||
android:layout_height="@dimen/dp_54"
|
||||
android:scaleType="fitXY"
|
||||
android:src="@drawable/blue_tooth"
|
||||
tools:ignore="ContentDescription" />
|
||||
|
||||
</RelativeLayout>
|
||||
<TextView
|
||||
android:id="@+id/ivMoFangBattery"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="12dip"
|
||||
android:textColor="@color/white"
|
||||
android:layout_gravity="bottom"
|
||||
android:visibility="gone"
|
||||
tools:text="18%"/>
|
||||
|
||||
</merge>
|
||||
@@ -336,4 +336,15 @@
|
||||
android:layout_marginStart="10dp"
|
||||
/>
|
||||
|
||||
<com.mogo.eagle.core.function.hmi.ui.setting.StateViewLayout
|
||||
android:id="@+id/mfStatusLayout"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="60dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginStart="15dp"
|
||||
android:layout_marginEnd="15dp"
|
||||
app:layout_constraintTop_toBottomOf="@+id/tvSpeedThresholdTitle"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"
|
||||
tools:layout_width="400dp"
|
||||
tools:layout_height="200dp">
|
||||
|
||||
<androidx.appcompat.widget.LinearLayoutCompat
|
||||
android:id="@+id/loading_view"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="0dip"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:gravity="center"
|
||||
tools:visibility="visible"
|
||||
android:visibility="invisible"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/loading_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@color/black"
|
||||
tools:text="正在加载,请稍候..."
|
||||
android:textSize="20dip"/>
|
||||
|
||||
<ProgressBar
|
||||
style="?android:attr/progressBarStyleSmall"
|
||||
android:layout_marginStart="5dip"
|
||||
android:layout_width="30dip"
|
||||
android:layout_height="30dip" />
|
||||
|
||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||
|
||||
<Button
|
||||
android:id="@+id/clicked"
|
||||
tools:visibility="visible"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="0dip"
|
||||
android:textSize="20dip"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:textColor="@color/black"
|
||||
tools:text="连接魔方"/>
|
||||
</merge>
|
||||
Reference in New Issue
Block a user