320 lines
11 KiB
Plaintext
320 lines
11 KiB
Plaintext
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)
|
|
}
|
|
}
|
|
|
|
|