import LinearLayout from 'android.widget.LinearLayout'; import Context from 'android.content.Context' import RelativeLayout from 'android.widget.RelativeLayout'; import ViewGroup from 'android.view.ViewGroup'; import View from 'android.view.View'; import { XTOAST_TYPE, XTOAST_TYPE_PRIVATE } from "../interface.uts" import Color from 'android.graphics.Color'; import Gravity from 'android.view.Gravity'; import GradientDrawable from 'android.graphics.drawable.GradientDrawable'; import TextView from 'android.widget.TextView'; import Typeface from 'android.graphics.Typeface'; import TextUtils from 'android.text.TextUtils'; import Uri from 'android.net.Uri'; import ObjectAnimator from 'android.animation.ObjectAnimator'; import ValueAnimator from 'android.animation.ValueAnimator'; import TimeInterpolator from 'android.animation.TimeInterpolator'; import MotionEvent from 'android.view.MotionEvent'; import { hexToRgb } from "../libs/color.uts" import { defaultConfig, configCover } from "../libs/config.uts" import ViewPropertyAnimator from 'android.view.ViewPropertyAnimator'; import AccelerateDecelerateInterpolator from 'android.view.animation.AccelerateDecelerateInterpolator'; // #ifdef UNI-APP-X import getCurrentPages from 'io.dcloud.uniapp.framework.getCurrentPages'; import onReady from 'io.dcloud.uniapp.framework.onReady'; import onUnload from 'io.dcloud.uniapp.framework.onUnload'; import onShow from 'io.dcloud.uniapp.framework.onShow'; import MeasureSpec from 'android.view.View.MeasureSpec'; // #endif import AttributeSet from 'android.util.AttributeSet'; import R from 'android.R'; import Bundle from "android.os.Bundle"; import Dialog from "android.app.Dialog"; import WindowManager from "android.view.WindowManager"; import Window from "android.view.Window"; import ColorDrawable from "android.graphics.drawable.ColorDrawable"; let tid : number | null = 0 let maskDomId = 588 class MaxWidthLinearLayout extends LinearLayout { private mMaxWidth = 300; constructor(context:Context) { super(context); } setMaximumWidth(maxWidth:Int) { this.mMaxWidth = maxWidth; this.requestLayout(); } override onMeasure(widthMeasureSpec:Int , heightMeasureSpec:Int ) { let widthSize = MeasureSpec.getSize(widthMeasureSpec); if (this.mMaxWidth > 0 && this.mMaxWidth < widthSize) { let widthMode = MeasureSpec.getMode(widthMeasureSpec); widthMeasureSpec = MeasureSpec.makeMeasureSpec(this.mMaxWidth.toInt(), widthMode); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } let dialogModal : FullScreenDialogFragment | null = null; class FullScreenDialogFragment extends Dialog { private mContext : Context; private opts : XTOAST_TYPE|null = null; private maskeDom:RelativeLayout|null = null; constructor(context : Context, optsOwer : XTOAST_TYPE|null) { super(context,R.style.Theme_Translucent_NoTitleBar_Fullscreen); this.mContext = context; this.opts = optsOwer } override onCreate(savedInstanceState ?: Bundle) { super.onCreate(savedInstanceState) this.requestWindowFeature(Window.FEATURE_NO_TITLE) // 禁止按键返回及侧滑返回. this.setCancelable(false) this.maskeDom = _createToastView(this.getContext(),this.window!.decorView! as ViewGroup,this.opts) // 设置窗口属性 let window = this.getWindow(); if (window != null) { // 首先设置全屏标志 window.setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN ); // 设置布局参数为全屏 window.setLayout( WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT ); // 设置背景透明 window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); window.setGravity(Gravity.CENTER); // 完整的沉浸式设置 let decorView = window.getDecorView(); let option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE decorView.setSystemUiVisibility(option); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) window.setStatusBarColor(Color.TRANSPARENT) window.setNavigationBarColor(Color.TRANSPARENT) window.setType(WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) } } override dismiss(){ super.dismiss() this.maskeDom = null; if(this.opts!=null){ let closeEvent = this.opts?.close??null if(closeEvent!=null){ closeEvent() } } dialogModal = null } } function px2dp(n : number) : number { const mets = UTSAndroid.getAppContext()!.resources!.getDisplayMetrics() return mets.density * n } export function hideToast() { UTSAndroid.getDispatcher("main").async(function (_) { dialogModal?.dismiss() if (tid != null) { clearTimeout(tid!) } }) } function __hideToast__(mainDialog:FullScreenDialogFragment | null) { UTSAndroid.getDispatcher("main").async(function (_) { mainDialog?.dismiss() if (tid != null) { clearTimeout(tid!) } }) } function _createToastView(context : Context, decorView : ViewGroup, opts : XTOAST_TYPE|null):RelativeLayout{ let realopts = opts == null ? ({ title: '' } as XTOAST_TYPE) : (opts!) let config = configCover(realopts) let rmbgColor = hexToRgb(config.maskBgColor); let textColor = hexToRgb(config.iconColor); let wrapColor = hexToRgb(config.contentBgColor); let titleColorRgb = hexToRgb(config.titleColor); let mbgColor = rmbgColor == null ? Color.parseColor(config.maskBgColor) : Color.argb((rmbgColor!.a * 255).toInt(), rmbgColor!.r.toInt(), rmbgColor!.g.toInt(), rmbgColor!.b.toInt()) let fontColor = textColor == null ? Color.parseColor(config.iconColor) : Color.argb((textColor!.a * 255).toInt(), textColor!.r.toInt(), textColor!.g.toInt(), textColor!.b.toInt()) let contentColor = rmbgColor == null ? Color.parseColor(config.contentBgColor) : Color.argb((wrapColor!.a * 255).toInt(), wrapColor!.r.toInt(), wrapColor!.g.toInt(), wrapColor!.b.toInt()) let titleColor = titleColorRgb == null ? Color.parseColor(config.titleColor) : Color.argb((titleColorRgb!.a * 255).toInt(), titleColorRgb!.r.toInt(), titleColorRgb!.g.toInt(), titleColorRgb!.b.toInt()) let maskerDom = new RelativeLayout(context) class MaskerDomClickListsner extends View.OnTouchListener { constructor() { super(); } override onTouch(view : View, event : MotionEvent) : Boolean { // 阻止事件向下传递。 return config.maskDisableClik; } } maskerDom.setOnTouchListener(new MaskerDomClickListsner()) let maskerDomLayrPrams = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) maskerDom.setLayoutParams(maskerDomLayrPrams) maskerDom.setBackgroundColor(mbgColor) maskerDom.setGravity(Gravity.CENTER) maskerDom.setId((maskDomId).toInt()) let contentWrapDiv = new MaxWidthLinearLayout(context); // 设置圆角背景 let bg = new GradientDrawable() bg.setColor(contentColor) bg.setCornerRadius((px2dp(16)).toFloat()) contentWrapDiv.setBackground(bg) // contentWrapDiv.setBackgroundColor(Color.parseColor(config.contentBgColor)) let wpx = px2dp(config.size).toInt(); let contentWrapDivParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) // contentWrapDivParams.width = px2dp(500).toInt();; const maxwidthbody = UTSAndroid.getAppContext()!.resources!.getDisplayMetrics().widthPixels contentWrapDiv.setMaximumWidth((Math.min((maxwidthbody-px2dp(80)),px2dp(320))).toInt()) contentWrapDiv.setMinimumHeight(wpx) contentWrapDiv.setMinimumWidth(wpx) contentWrapDiv.setLayoutParams(contentWrapDivParams) if ((config.iconCode != '' && config.title != '') || (config.iconCode != '' && config.title == '')) { contentWrapDiv.setMinimumHeight(wpx) } else { wpx = px2dp(32 + config.titleSize).toInt(); contentWrapDiv.setMinimumHeight(wpx) } let wpadingx = px2dp(16).toInt(); contentWrapDiv.setPadding(wpadingx, wpadingx, wpadingx, wpadingx) contentWrapDiv.setGravity(Gravity.CENTER) contentWrapDiv.setOrientation(LinearLayout.VERTICAL) // 创建图标。 let iconDiv = new TextView(context) // iconDiv.setLineHeight(1) iconDiv.setTextColor(fontColor) let assetManager = context!.getAssets(); let typeface = Typeface.createFromAsset(assetManager, "remixicon.ttf") iconDiv.setTypeface(typeface) iconDiv.setGravity(Gravity.CENTER) iconDiv.setTextSize(config.iconSize.toFloat()) if (!TextUtils.isEmpty(config.iconCode) && config.iconCode != '') { let codePoint = Integer.parseInt(config.iconCode, 16); let charArray = Character.toChars(codePoint); let text = new String(charArray); iconDiv.setText(text); contentWrapDiv.addView(iconDiv) } if (config.title != "") { // 添加一个title let titleDiv = new TextView(context) titleDiv.setText(config.title) titleDiv.setTextSize((config.titleSize).toFloat()) titleDiv.setTextColor(titleColor) titleDiv.setGravity(Gravity.CENTER) contentWrapDiv.addView(titleDiv) } maskerDom.setAlpha((0).toFloat()) maskerDom.addView(contentWrapDiv) decorView.addView(maskerDom!) try { let s0 = (0).toFloat() let s1 = (1).toFloat() contentWrapDiv.setAlpha(s0) contentWrapDiv.setScaleX(s0) contentWrapDiv.setScaleY(s0) // 遮罩渐变 const maskAni = maskerDom.animate() as ViewPropertyAnimator; maskAni.alpha(s1) .setDuration(300) .setInterpolator(AccelerateDecelerateInterpolator()) .start() let ani = contentWrapDiv.animate() as ViewPropertyAnimator; ani.alpha(s1) .scaleX(s1) .scaleY(s1) .setDuration(300) .setInterpolator(AccelerateDecelerateInterpolator()) .start() } catch (e) { //TODO handle the exception } if (config.duration == 0) return maskerDom tid = setTimeout(function () { tid = null; __hideToast__(dialogModal) }, (config.duration + 300).toInt()); return maskerDom } function _showToast_(opts : XTOAST_TYPE | null) { if (tid != null) { clearTimeout(tid!) } dialogModal = new FullScreenDialogFragment(UTSAndroid.getUniActivity()!,opts) UTSAndroid.getDispatcher("main").async(function (_) { dialogModal?.show() }) } export function showToast(opts : XTOAST_TYPE | null) { // hideToast() dialogModal?.dismiss() const pages = getCurrentPages(); if (pages.length > 0) { const page = pages[pages.length - 1].vm! const instance = page.$ if (page.$isReady) { _showToast_(opts) // onShow(()=>{ // console.log('on show page') // },instance) // onReady(() => { // console.log('on ready page') // }, instance) } else { hideToast() } onUnload(() => { hideToast() }, instance) }else{ _showToast_(opts) } }