Me inscribí en el Desafío Fase 1 del Proyecto Piedra Dorada - Divide el pozo de premios de 100,000, este es mi octavo artículo, haz clic para ver los detalles del evento
Uncle Tooth Tutorial es simple y fácil de entender
Efecto
ideas
Smart Island es una ventana flotante, no hacemos funciones específicas, solo trabajo de superficie,
Así que solo escribimos una ventana flotante;
La ventana flotante no puede interferir con la operación del usuario, por lo tanto, al dibujar la bola, se debe usar otra ventana flotante.
La ventana flotante no responde a ningún evento de clic, solo dibuja
Así que hay dos ventanas flotantes en total;
- una barra de notificaciones
- pantalla completa uno
Ventana flotante isla inteligente
codigo xml
this.window = floaty.rawWindow(
<card id="root" cardCornerRadius="{{cardCornerRadius}}px" gravity="center" w="{{ windowWidth }}px" h="{{ windowHeight }}px" cardBackgroundColor="#000000">
<text id="count" w="*" gravity="center" textColor="#ff000f" textSize="{{textSize}}px">
0
</text>
</card>
);
复制代码
Para tener una experiencia de apariencia consistente en cada resolución media, el ancho y la altura aún se calculan primero y luego se muestra la interfaz de usuario.
this.config = {
width: {
ratio: 0.2,
},
height: {
ratio: 1,
},
};
this.config.width = parseInt(device.width * this.config.width.ratio);
this.config.height = parseInt(STATUS_BAR_HEIGHT * this.config.height.ratio);
复制代码
Para obtener el valor de la variable en el subproceso de la interfaz de usuario, debe vincular la variable
runtime.ui.bindingContext.windowWidth = windowWidth;
复制代码
Si es demasiado largo para recordar, puede agregar fragmentos de código en vscode
"runtime.ui.bindingContext.windowWidth=windowWidth": {
"scope": "javascript,typescript",
"prefix": "bindui",
"body": ["runtime.ui.bindingContext.windowWidth=windowWidth;"],
"description": "runtime.ui.bindingContext.windowWidth=windowWidth"
},
复制代码
Después de ingresar, ingrese bindui, puede ingresar rápidamente esta línea de código
runtime.ui.bindingContext.windowWidth = windowWidth;
复制代码
La ventana flotante se puede mover arbitrariamente, utilizando el código encapsulado en el tutorial anterior
makeWindowMoveable
复制代码
El último tutorial es: ventana flotante autojs para traducir palabras
La isla inteligente está terminada, dibujemos la bola inteligente
Pelota inteligente
Haga clic en la isla inteligente, aparece la bola inteligente y la bola inteligente se dibuja en una ventana flotante de pantalla completa
Ventana flotante a pantalla completa
Este es el método de pantalla completa anterior
function fullScreen(window) {
let LayoutParams = android.view.WindowManager.LayoutParams;
let mWindow = getClassField(window, "mWindow");
log(mWindow); // com.stardust.autojs.core.floaty.RawWindow@26b1509
let params = mWindow.getWindowLayoutParams();
//设置全屏悬浮窗
params.flags |= LayoutParams.FLAG_FULLSCREEN | LayoutParams.FLAG_LAYOUT_IN_SCREEN | LayoutParams.FLAG_LAYOUT_NO_LIMITS;
ui.run(function () {
mWindow.updateWindowLayoutParams(params);
window.setSize(device.width, device.height);
});
}
复制代码
pantalla completa ahora
window.setSize(-1, -1);
复制代码
\
La bola inteligente aparece lentamente
Haga clic en la isla inteligente, la bola inteligente aparece lentamente
Dibujar una bola es usar drawCircle of canvas
canvas.drawCircle(ballData.centerX, ballData.centerY, ballData.radius, this.paint);
复制代码
La pelota se mueve hacia abajo, podemos usar ValueAnimator para configurar el monitor para cambiar la altura del centro de la pelota
this.valueAnimator = ValueAnimator.ofFloat(beginValue, endValue);
this.valueAnimator.setDuration(1000);
this.valueAnimator.addUpdateListener({
onAnimationUpdate: function (animation) {
let value = animation.getAnimatedValue();
ballData.centerY = value;
},
});
复制代码
añadir una línea
canvas.drawLine(islandWindowRect.centerX, islandWindowRect.centerY, ballData.centerX, ballData.centerY, this.paint);
复制代码
\
donde va la pelota
Aquí hemos agregado dos ValueAnimators para controlar el XY en el movimiento de la pelota;
this.valueAnimatorX = ValueAnimator.ofFloat(beginValueX, endValueX, beginValueX);
this.valueAnimatorY = ValueAnimator.ofFloat(beginValueY, endValueY, beginValueY);
复制代码
animaciones para ejecutar simultáneamente
this.animatorSet = new AnimatorSet();
this.animatorSet.playTogether(this.valueAnimatorX, this.valueAnimatorY);
this.animatorSet.setDuration(300);
复制代码
Activar la animación después de presionar y levantar el dedo
switch (event.getAction()) {
case event.ACTION_DOWN:
return true;
case event.ACTION_MOVE:
return true;
case event.ACTION_UP:
let touchPoint = {
x: event.getRawX(),
y: event.getRawY(),
};
that.updateTouchValueAnimator(touchPoint);
that.animatorSet.start();
return true;
}
复制代码
\
efecto de pantalla rota
Use ps para hacer una imagen de vidrios rotos, o haga algunas imágenes más seleccionadas al azar para dibujar
for (var i = 0; i < len; i++) {
let glass = this.glasses[i];
canvas.drawBitmap(this.glassBitmap, glass.x - this.glassBitmapHalfWidth, glass.y - this.glassBitmapHalfHeight, this.paint);
}
复制代码
Tutorial de texto, si no puedo escuchar el sonido, no agregaré el efecto de sonido
alrededores
Dispositivo: Mi 11pro
Versión de Android: 12
Emulador de Thunderbolt: 9.0.17
Versión de Android: 9
Versión de Autojs: 9.2.13
frases famosas
Las ideas son las más importantes, otros Baidu, bing, stackoverflow, github, la documentación de Android, la documentación de autojs y, finalmente, el grupo para preguntar --- Uncle Tooth Tutorial
declaración
Parte del contenido proviene de Internet. Este tutorial es solo para aprender, y está prohibido usarlo para otros fines.