我没有开始通过QML开发我的学习Android,我只是好奇Toasts似乎是一个特定于Android的小部件,而Qt for Android似乎没有现成的相应小部件,那么如何在Android中实现Toast in Android QML?
Ayb*_*gür 10
与fpermana的答案相比,类似但恕我直言更优雅的方法如下.
Toast.qml,可以单独使用,并可以非自我毁灭的方式重复使用:
import QtQuick 2.0
/**
* @brief An Android-like timed message text in a box that selfdestroys when finished if desired
*/
Rectangle{
/**
* Public
*/
/**
* @brief Shows this Toast
*
* @param {string} text Text to show
* @param {real} duration Duration to show in milliseconds, defaults to 3000
*/
function show(text, duration){
theText.text = text;
if(typeof duration !== "undefined"){
if(duration >= 2*fadeTime)
time = duration;
else
time = 2*fadeTime;
}
else
time = defaultTime;
anim.start();
}
property bool selfDestroying: false ///< Whether this Toast will selfdestroy when it is finished
/**
* Private
*/
id: root
property real time: defaultTime
readonly property real defaultTime: 3000
readonly property real fadeTime: 300
property real margin: 10
width: childrenRect.width + 2*margin
height: childrenRect.height + 2*margin
radius: margin
anchors.horizontalCenter: parent.horizontalCenter
opacity: 0
color: "white"
Text{
id: theText
text: ""
horizontalAlignment: Text.AlignHCenter
x: margin
y: margin
}
SequentialAnimation on opacity{
id: anim
running: false
NumberAnimation{
to: 0.9
duration: fadeTime
}
PauseAnimation{
duration: time - 2*fadeTime
}
NumberAnimation{
to: 0
duration: fadeTime
}
onRunningChanged:{
if(!running && selfDestroying)
root.destroy();
}
}
}
Run Code Online (Sandbox Code Playgroud)
ToastManager.qmlToast如果同时显示多个,则创建并组织s:
import QtQuick 2.0
/**
* @brief Manager that creates Toasts dynamically
*/
Column{
/**
* Public
*/
/**
* @brief Shows a Toast
*
* @param {string} text Text to show
* @param {real} duration Duration to show in milliseconds, defaults to 3000
*/
function show(text, duration){
var toast = toastComponent.createObject(root);
toast.selfDestroying = true;
toast.show(text, duration);
}
/**
* Private
*/
id: root
z: Infinity
spacing: 5
anchors.centerIn: parent
property var toastComponent
Component.onCompleted: toastComponent = Qt.createComponent("Toast.qml")
}
Run Code Online (Sandbox Code Playgroud)
main.qml使用ToastManager:
import QtQuick 2.0
ApplicationWindow{
visible: true
/* other components of the application */
ToastManager{ id: toast }
onSomeEvent: toast.show("Some event happened")
onImportantEvent: toast.show("An important event happened!", 5000)
}
Run Code Online (Sandbox Code Playgroud)
小智 5
也许是这样的......
这是InfoBanner.qml
import QtQuick 2.2
Loader {
id: messages
function displayMessage(message) {
messages.source = "";
messages.source = Qt.resolvedUrl("InfoBannerComponent.qml");
messages.item.message = message;
}
width: parent.width
anchors.bottom: parent.top
z: 1
onLoaded: {
messages.item.state = "portrait";
timer.running = true
messages.state = "show"
}
Timer {
id: timer
interval: 2500
onTriggered: {
messages.state = ""
}
}
states: [
State {
name: "show"
AnchorChanges { target: messages; anchors { bottom: undefined; top: parent.top } }
PropertyChanges { target: messages; anchors.topMargin: 100 }
}
]
transitions: Transition {
AnchorAnimation { easing.type: Easing.OutQuart; duration: 300 }
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于InfoBannerComponent.qml
import QtQuick 2.2
Item {
id: banner
property alias message : messageText.text
height: 70
Rectangle {
id: background
anchors.fill: banner
color: "darkblue"
smooth: true
opacity: 0.8
}
Text {
font.pixelSize: 24
renderType: Text.QtRendering
width: 150
height: 40
id: messageText
anchors.fill: banner
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.WordWrap
color: "white"
}
states: State {
name: "portrait"
PropertyChanges { target: banner; height: 100 }
}
MouseArea {
anchors.fill: parent
onClicked: {
messages.state = ""
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是为main.qml
import QtQuick 2.3
import QtQuick.Window 2.2
Window {
visible: true
width: 360
height: 360
MouseArea {
anchors.fill: parent
onClicked: {
Qt.quit();
}
}
Text {
text: qsTr("Hello World")
anchors.centerIn: parent
}
InfoBanner {
id: messages
}
Component.onCompleted: messages.displayMessage("Hello World");
}
Run Code Online (Sandbox Code Playgroud)
在marxoft dot co dot uk向marxian致敬