编程知识 cdmana.com

Android Training Series (13), ces connaissances que vous devez prendre

int top = (int) progressPoint.y;
wordPaint.getTextBounds(state, 0, state.length(), rect);
if (left < radius + getPaddingLeft() + specialScaleLineLength + scaleToRingSpace + wordWith) {
left -= rect.width();
}
if (top > radius + getPaddingTop() + specialScaleLineLength + scaleToRingSpace + wordHeigh) {
top += rect.height();
}
canvas.drawText(state, left, top, wordPaint);
}

Le but de cette méthode est d'obtenir l'intersection du rayon final du secteur et de l'arc circulairex, yCoordonnées,Les intérêts peuvent être étudiés sous:

/**

  • @param cirX CerclecenterX
  • @param cirY CerclecenterY
  • @param radius Rayon du cercle
  • @param cirAngle Angle d'arc actuel
  • @param orginAngle Angle d'Arc de départ
  • @return Intersection du rayon final du ventilateur et de l'arc xyCoordonnées
    */
    public static PointF calcArcEndPointXY(float cirX, float cirY, float radius,
    float cirAngle, float orginAngle) {
    cirAngle = (orginAngle + cirAngle) % 360;
    return calcArcEndPointXY(cirX, cirY, radius, cirAngle);
    }

/*

  • @param cirAngle Angle d'arc actuel
    */
    public static PointF calcArcEndPointXY(float cirX, float cirY,
    float radius, float cirAngle) {
    float posX = 0.0f;
    float posY = 0.0f;
    // Convertir l'angle en radians
    float arcAngle = (float) (Math.PI * cirAngle / 180.0);
    if (cirAngle < 90) {
    posX = cirX + (float) (Math.cos(arcAngle)) * radius;
    posY = cirY + (float) (Math.sin(arcAngle)) * radius;
    } else if (cirAngle == 90) {
    posX = cirX;
    posY = cirY + radius;
    } else if (cirAngle > 90 && cirAngle < 180) {
    arcAngle = (float) (Math.PI * (180 - cirAngle) / 180.0);
    posX = cirX - (float) (Math.cos(arcAngle)) * radius;
    posY = cirY + (float) (Math.sin(arcAngle)) * radius;
    } else if (cirAngle == 180) {
    posX = cirX - radius;
    posY = cirY;
    } else if (cirAngle > 180 && cirAngle < 270) {
    arcAngle = (float) (Math.PI * (cirAngle - 180) / 180.0);
    posX = cirX - (float) (Math.cos(arcAngle)) * radius;
    posY = cirY - (float) (Math.sin(arcAngle)) * radius;
    } else if (cirAngle == 270) {
    posX = cirX;
    posY = cirY - radius;
    } else {
    arcAngle = (float) (Math.PI * (360 - cirAngle) / 180.0);
    posX = cirX + (float) (Math.cos(arcAngle)) * radius;
    posY = cirY - (float) (Math.sin(arcAngle)) * radius;
    }
    return new PointF(posX, posY);
    }

L'effet de gradient de couleur est réalisé,Est d'obtenir une échelle égale dans le segment de couleur correspondant à chaque échelle16Valeur de couleur décimale,Les codes sont les suivants::

/**

  • Obtenir la valeur actuelle de la couleur du gradient par graduation
  • @param p Échelle actuelle
  • @param specialScaleCorlors Valeurs de couleur pour chaque plage
  • @return Valeur de couleur actuellement requise
    */
    public static int evaluateColor(int p, int[] specialScaleCorlors) {
    // Gamme de couleurs définie
    int startInt = 0xFFbebebe;
    int endInt = 0xFFbebebe;
    float fraction = 0.5f;

if (p != 0 && p != 100) {
startInt = specialScaleCorlors[p / 20];
endInt = specialScaleCorlors[p / 20 + 1];
fraction = (p - (p / 20) * 20) / 20f;
}
int startA = (startInt >> 24) & 0xff;
int startR = (startInt >> 16) & 0xff;
int startG = (startInt >> 8) & 0xff;
int startB = startInt & 0xff;

int endA = (endInt >> 24) & 0xff;
int endR = (endInt >> 16) & 0xff;
int endG = (endInt >> 8) & 0xff;
int endB = endInt & 0xff;

return (int) ((startA + (int) (fraction * (endA - startA))) << 24)
| (int) ((startR + (int) (fraction * (endR - startR))) << 16)
| (int) ((startG + (int) (fraction * (endG - startG))) << 8)
| (int) ((startB + (int) (fraction * (endB - startB))));
}

Les autres détails et méthodes ne seront pas affichés,C'est plus conventionnelPaintMéthodes.

Châtaignesγ

Cet effet est très similaire à celui ci - dessus,La différence est que ce contrôle peut sélectionner l'échelle en faisant glisser,Voir ci - dessous pour plus de détails:

AndroidSérie de culture(XIII.),Tu dois prendre ces connaissances._Android

En train de dessiner“Faites glisser le bouton”BitmapQuand,La difficulté, c'est d'être sûrbitmapCoordonnées de,C'est - à - dire selon les coordonnées du Centre du cercle,Rayon,Angle du ventilateur pour trouver l'intersection du rayon final du ventilateur et de l'arcx, yCoordonnées,C'est déjà dit,Pour qu'on puisse calculerbitmapLes coordonnées du coin supérieur gauche de.

L'effet de traînée est dans la zone que nous autorisons,Quand les doigts sont pressés,Les doigts glissent,Quand le doigt se lève,Continuer à tracer les progrès correspondantsp,Donner l'illusion que les anneaux sont animés,En fait, c'est juste le résultat d'un repeuplement constant.Il faut qu'on passeonTouchEventMéthode pour écouter les gestes et obtenir les coordonnées actuelles.La difficulté, c'est que c'est un arc,Comment obtenir l'angle à partir des coordonnées actuelles,Et obtenir les progrès correspondants en fonction de l'angle.Voici un exemple de code::

@Override
public synchronized boolean onTouchEvent(MotionEvent event) {

int action = event.getAction();
int x = (int) event.getX();
int y = (int) event.getY();

switch (action) {
case MotionEvent.ACTION_DOWN:
// isOnRing Note Voir ci - dessous
if (isOnRing(x, y) && y <= radius + getPaddingTop() + specialScaleLineLength + scaleToRingSpace) {
updateProgress(x, y);
return true;
}
break;
case MotionEvent.ACTION_MOVE:
if (y <= radius + getPaddingTop() + specialScaleLineLength + scaleToRingSpace) {
updateProgress(x, y);
}
return true;
case MotionEvent.ACTION_UP:
invalidate();
break;
}

return super.onTouchEvent(event);
}

Ceci est basé sur la position du point courant,Méthode de conversion aux progrès actuels:

private void updateProgress(int eventX, int eventY) {

double angle = Math.atan2(eventY - (radius + getPaddingLeft() + specialScaleLineLength + scaleToRingSpace)
, eventX - (radius + getPaddingLeft() + specialScaleLineLength + scaleToRingSpace)) / Math.PI;
angle = ((2 + angle) % 2 + (-beginLocation / 180f)) % 2;

if ((int) Math.round(angle * 100) >= 0) {
progress = (int) Math.round(angle * 100);
realShowProgress = getShowProgress(progress);
}

invalidate();
}

Il est important de noter que,Quand on traîne“Faites glisser le bouton”Heure,Nous devons définir une zone spécifique pour recevoir les événements,Seulement si l'utilisateur appuie dans la zone coulissante spécifiée,Pour permettre à l'utilisateur de faire glisser la barre de progression,Vous ne pouvez pas faire glisser de petites icônes n'importe où pour changer la progression,C'est une façon de déterminer si la position actuelle de l'écran tactile se trouve dans une zone glissante:

private boolean isOnRing(float eventX, float eventY) {

boolean result = false;
double distance = Math.sqrt(Math.pow(eventX - (radius + getPaddingLeft() + specialScaleLineLength + scaleToRingSpace), 2)

  • Math.pow(eventY - (radius+getPaddingLeft() + specialScaleLineLength + scaleToRingSpace), 2));

if (distance < (2 * radius+getPaddingLeft() + getPaddingRight() + 2 * (specialScaleLineLength + scaleToRingSpace))
&& distance > radius - slideAbleLocation) {
result = true;
}

return result;
}

Les autres détails et méthodes ne seront pas affichés,C'est plus conventionnelPaintMéthodes.

Châtaignesδ

C'est une diffusion ondulée、L'effet de la réduction de la rotation de la sphère,Voir ci - dessous pour plus de détails:

AndroidSérie de culture(XIII.),Tu dois prendre ces connaissances._Programmeur_02

Cet effet est personnalisé par un toutViewEn dessinant constamment.Où l'animation de diffusion des ondulations,Pour ce faire, on modifie périodiquement le rayon de l'ondulation,Cette ondulation se compose de deux cercles creux consécutifs,Faites attention aux changements de temps et de taille dans le processus de mise en œuvre,Voir le Code de base ci - dessous:

public void startAnima() {
if (drawTimingThread != null) {
drawTimingThread.sendEmptyMessage(MSG_DRAW0); // C'est parti.1Ondulation
float time = (mRMaxRadius - mRMinRadius) / distance * 0.5f; // Prenez tout d'abord,Encore une fois
drawTimingThread.sendEmptyMessageDelayed(MSG_DRAW1, (int)(animaBotIntervalTime * time));//Ouverture programmée2Ondulation
}
}

C'est ondulé1Changement de rayon de,Les codes de référence sont les suivants::

if (mCurRadius0 <= mRMaxRadius) {
mCurRadius0 += distance;
} else {
mCurRadius0 = mRMinRadius + distance;
}
circlePointF0 = drawCircleOnRipple(MSG_DRAW0, curIndex0);

mRPaint0.setAlpha(getAlphaOfRipple(curIndex0));//Transparence
mCirclePaint0.setAlpha(getAlphaOfRipple(curIndex0));
curRadius0 = getRadiusOnRipple(curIndex0);
curIndex0++;
if (curIndex0 > (mRMaxRadius - mRMinRadius) / distance)
curIndex0 = 0;

cancleHandle(MSG_DRAW0);

L'effet d'animation de la sphère est ici tous les200msDessiner à l'endroit approprié,En raison de la courte période de diffusion des ondulations,J'ai donc fixé la période de rotation entre les sphères à45Degré,Peut être modifié.La difficulté ici est aussi de trouver les coordonnées centrales de la sphère,C'est - à - dire selon les coordonnées du Centre du cercle,Rayon,Angle du ventilateur pour trouver l'intersection du rayon final du ventilateur et de l'arcx, yLa question des coordonnées,Comme on l'a déjà dit plus haut,Voir le code ci - dessous:

private PointF drawCircleOnRipple(int msg, int index) {

// Début du cycle,Angle initial aléatoire
if (index == 0 && msg == MSG_DRAW0) {
cirAngel0 = (float) (Math.random() * -360 + 180);
} else if (index == 0) {
cirAngel1 = (float) (Math.random() * -360 + 180);
}

return CommentUtil.calcArcEndPointXY(
mRMaxRadius + getPaddingLeft() + mStrokeWidth
, mRMaxRadius + getPaddingTop() + mStrokeWidth
, msg == MSG_DRAW0 ? mCurRadius0 : mCurRadius1
// Chaque cycle tourne45Degré
, (msg == MSG_DRAW0 ? curIndex0 : curIndex1) * 1.0f
/ ((mRMaxRadius - mRMinRadius) / distance) * 45f
, msg == MSG_DRAW0 ? cirAngel0 : cirAngel1);
}

Effet de gradient de couleur des ondulations et des sphères,Parce que ce n'est pas un gradient vers la pleine transparence,Donc, la miennealphaPlage de valeurs105-255,Voir le code ci - dessous:

private int getAlphaOfRipple(int curIndex) {
final int alpha = curIndex * 150 * distance / (mRMaxRadius - mRMinRadius); // Prends juste150Binaire de
return 255 - alpha;
}

Les autres détails et méthodes ne seront pas affichés,C'est plus conventionnelPaintMéthodes.

Châtaignesε

Cet effet est obtenu en ajustant quatre courbes de Bessel,Voir ci - dessous.:

AndroidSérie de culture(XIII.),Tu dois prendre ces connaissances._Développement mobile_03

Enfin

En fait...AndroidTant de points de connaissance sont développés,C'est une question d'interview ou quelque chose comme ça.Donc l'interview n'a pas d'autre astuce,Seulement si vous êtes bien préparé à ces points de connaissance.so,Quand vous sortez pour un entretien d'embauche, regardez d'abord à quel stade vous avez passé en revue.

Bien que Android Pas aussi chaud qu'il y a quelques années,Il est temps de trouver des emplois bien rémunérés avec les quatre composantes.Cela ne peut qu'illustrer Android Les postes inférieurs au niveau intermédiaire sont saturés,L'ingénieur principal manque encore,Beaucoup de postes de haut niveau offrent des salaires très élevés(Il n'y a pas besoin d'argent pour trouver le bon.),C'est pourquoi il est important de travailler dur pour devenir ingénieur principal.

Vous trouverez ci - joint des dizaines d'ensembles d'octets liés aux questions d'entrevue ci - dessus,JD,Millet,Tencent、Les gros titres、Ali!、Meituan et al21Questions d'entrevue pour.Les points techniques ont été regroupés en vidéos etPDF(Il a fallu plus d'énergie que prévu),Contient le contexte de la connaissance + Beaucoup de détails.

En raison de l'espace limité,Voici une petite partie de l'image.

AndroidSérie de culture(XIII.),Tu dois prendre ces connaissances._Développement mobile_04

En détail dansGitHubOn se voit.;

 AndroidVidéo de schéma+BATSujet de l'entrevuePDF+Notes d'étude?

Apprentissage en ligne AndroidUn tas d'informations.,Mais si les connaissances acquises ne sont pas structurées,Quand vous rencontrez des problèmes, vous n'avez qu'à essayer.,Plus d'étude approfondie,Il est donc difficile d'obtenir une véritable amélioration technologique.J'espère que ce système technologique systématique vous donnera une orientation.

版权声明
本文为[Mb61c1dbbb44788]所创,转载请带上原文链接,感谢
https://cdmana.com/2022/01/202201150224018018.html

Scroll to Top