Mostrar información sobre la superposición en la primera ejecución

Cuando se ejecuta por primera vez (o después de una actualización importante), algunas aplicaciones de Google o el propio sistema Android mismo a veces muestran una superposición transparente con una breve descripción de cómo utilizar las nuevas funciones. Un ejemplo podría ser la imagen de abajo.

¿Hay algún API en el marco de Android para crear estos o es todo personalizado? ¿Cómo se implementaría en este último caso? Y por último, pero no menos importante, ¿estas sugerencias tienen algún tipo de nombre oficial / técnico por el cual se puede hacer referencia a ellas (podría ser útil cuando se busque algo de información sobre el tema)? Gracias.

Editar

He adquirido una captura de pantalla que ilustra más precisamente lo que quiero decir. Aparte de la "mano apuntando" gráfico, este tooltip ofrece un círculo que destaca alrededor del icono de la aplicación del reloj. Esto no es simplemente una superposición translúcida que desaparece después de hacer clic: El ícono del Reloj puede ser pulsado o incluso presionado en este momento, pero otros iconos (fuera del círculo) no son accesibles hasta que el toolip desaparezca. ¿Es todo este comportamiento hecho a la medida específicamente para este propósito, o existe alguna instalación incorporada?

Introduzca aquí la descripción de la imagen

Es sólo un diálogo translúcido.

Inserte el siguiente código en themes.xml en la carpeta res

<style name="Theme.TranparentDialog" parent="@android:style/Theme.NoTitleBar"> <item name="android:colorBackgroundCacheHint">@null</item> <item name="android:windowIsTranslucent">true</item> <item name="android:colorForeground">@color/transparent</item> <item name="android:windowIsFloating">false</item> <item name="android:backgroundDimEnabled">false</item> <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> <item name="android:windowBackground">@color/transparent</item> </style> 

Crear el diálogo a través de la pantalla para obtener un efecto translúcido /

 Dialog dialog= new Dialog(context, R.style.Theme_TutorialDialog); 

Dialog.show ();

Creo que está usando la biblioteca ShowcaseView . Vea esta pregunta relacionada

Esta vista se puede utilizar para dibujar un rectángulo transparente sobre la pantalla si se utiliza como fondo en el cuadro de diálogo anterior.

 public class WindowView extends View { private static final int LOW_DPI_STATUS_BAR_HEIGHT = 19; private static final int MEDIUM_DPI_STATUS_BAR_HEIGHT = 25; private static final int HIGH_DPI_STATUS_BAR_HEIGHT = 38; Context mContext; int mHeight, mWidth, mTop, mRight, mLeft, mBottom; Rect mLeftRect, mRightRect, mTopRect, mBottomRect; Rect mRect; Paint mPaint; View mAnchorView; Paint mTempPaint1; public WindowView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public WindowView(Context context) { this(context, null); } public WindowView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; initVariables(); } boolean mReset = false; GestureDetector mGestureDetector; GestureDetector.SimpleOnGestureListener mSimpleOnGestureListener; private View getView() { return this; } @Override public boolean onTouchEvent(MotionEvent event) { if (mSimpleOnGestureListener == null) { mSimpleOnGestureListener = new SimpleOnGestureListener() { @Override public boolean onSingleTapConfirmed(MotionEvent e) { if (mListener != null && e.getX() >= mRect.left && e.getX() <= mRect.right && e.getY() >= mRect.top && e.getY() <= mRect.bottom) mListener.onClick(getView()); return true; } }; } if (mGestureDetector == null) { mGestureDetector = new GestureDetector(mContext, mSimpleOnGestureListener); } mGestureDetector.onTouchEvent(event); return true; } private void initVariables() { mPaint = new Paint(); mPaint.setStyle(Style.FILL); mPaint.setColor(mContext.getResources().getColor( R.color.tut_transcluscent_bg)); mRect = new Rect(); mTempPaint1 = new Paint(Paint.ANTI_ALIAS_FLAG); mTempPaint1.setAlpha(64); mTempPaint1.setColorFilter(new PorterDuffColorFilter(Color.WHITE, Mode.SRC_IN)); } OnClickListener mListener; public void setTransparentBackGroundColor(int color) { mPaint.setColor(color); invalidate(); } @Override public void setOnClickListener(OnClickListener l) { mListener = l; } public View getAnchorView() { return mAnchorView; } float[] mPaddings; Rect mAnchorRect;; public void setAnchorView(View mView, Rect rect, float[] paddings) { mAnchorRect = rect; if (mAnchorRect == null) mAnchorView = mView; else mAnchorView = null; mPaddings = paddings; requestLayout(); invalidate(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (mAnchorView != null || mAnchorRect != null) initView(); mReset = true; } boolean mFlagInvalid = false; Handler mAnrHandler; public void setHandler(Handler handler) { mAnrHandler = handler; } private int getStatusBarHeight() { DisplayMetrics displayMetrics = new DisplayMetrics(); ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)) .getDefaultDisplay().getMetrics(displayMetrics); int statusBarHeight; switch (displayMetrics.densityDpi) { case DisplayMetrics.DENSITY_HIGH: statusBarHeight = HIGH_DPI_STATUS_BAR_HEIGHT; break; case DisplayMetrics.DENSITY_MEDIUM: statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT; break; case DisplayMetrics.DENSITY_LOW: statusBarHeight = LOW_DPI_STATUS_BAR_HEIGHT; break; default: statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT; } return statusBarHeight; } public void initView() { mFlagInvalid = false; int top = 0, left = 0; if (mAnchorView != null) { top = mAnchorView.getTop(); left = mAnchorView.getLeft(); View temp = mAnchorView; int cnt = 0; try { while (((View) temp.getParent()).getId() != android.R.id.content) { temp = (View) temp.getParent(); int scrolledHeight = 0; if (temp instanceof ScrollView) { scrolledHeight = ((ScrollView) temp).getScrollY(); } top = top + temp.getTop() - scrolledHeight; left = left + temp.getLeft(); cnt++; if (cnt > 100) { if (mAnrHandler != null) mAnrHandler.sendEmptyMessage(9); mFlagInvalid = true; break; } } } catch (Exception e) { mFlagInvalid = true; if (mAnrHandler != null) mAnrHandler.sendEmptyMessage(8); e.printStackTrace(); } TypedValue tv = new TypedValue(); if (getContext() .getTheme() .resolveAttribute( VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB ? android.R.attr.actionBarSize : R.attr.actionBarSize, tv, true)) { int actionBarHeight = TypedValue.complexToDimensionPixelSize( tv.data, getResources().getDisplayMetrics()); top = top + actionBarHeight; } } else if (mAnchorRect != null) { } if (mFlagInvalid) init(20, 20, 50, 50); else { if (mAnchorRect != null) { init(mAnchorRect.bottom, mAnchorRect.right, mAnchorRect.left, mAnchorRect.top); } else init(mAnchorView.getHeight(), mAnchorView.getWidth(), left, top); } } public void init(int height, int width, int left, int top) { mWidth = width; mHeight = height; mTop = top; mBottom = top + height; mLeft = left; mRight = left + width; mLeft = (int) (mLeft + mPaddings[0] * mWidth); mTop = (int) (mTop + mPaddings[1] * mHeight); mRight = (int) (mRight - mPaddings[2] * mWidth); mBottom = (int) (mBottom - mPaddings[3] * mHeight); mRect = new Rect(mLeft, mTop, mRight, mBottom); invalidate(); } public Rect getAnchorRect() { return mRect; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); initOnceOnDraw(); canvas.drawRect(mLeftRect, mPaint); canvas.drawRect(mTopRect, mPaint); canvas.drawRect(mRightRect, mPaint); canvas.drawRect(mBottomRect, mPaint); canvas.drawRect(mRect, mTempPaint1); } private void initOnceOnDraw() { if (mReset) { mReset = false; mTopRect = new Rect(0, 0, getWidth(), mRect.top); mLeftRect = new Rect(0, mRect.top, mRect.left, mRect.bottom); mRightRect = new Rect(mRect.right, mRect.top, getWidth(), mRect.bottom); mBottomRect = new Rect(0, mRect.bottom, getWidth(), getHeight()); } }} 

El método setAnchorView () da la vista sobre la que se debe dibujar la superposición.

  mWindowView = (WindowView) mTutorialView .findViewById(R.id.windowview_tutorial); mWindowView.setTransparentBackGroundColor(backgroundColor); mWindowView.setAnchorView(view, null, padding); 

Espero que esto ayude

  • Actualizar la interfaz de usuario desde el subproceso
  • Anulación de onTouchEvent que compite con ScrollView
  • Cómo hacer una interfaz de usuario avanzada en Android?
  • LibGDX - Selector de color
  • ¿Cómo puedo obtener una función de paginación en vista de desplazamiento horizontal sin ViewPager?
  • Cómo conseguir estrellas favoritas
  • Actualizaciones de interfaz de usuario de subprocesos en Android
  • Android: cambia la posición del icono de diálogo de alerta
  • Disposición de Android: vistas cuadráticas
  • Cómo implementar Swipe en Android juego sin vista
  • ¿Cómo mostrar la imagen GIF animado en la aplicación Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.