NekoX/TMessagesProj/src/main/java/org/telegram/ui/Components/Tooltip.java

116 lines
3.5 KiB
Java

package org.telegram.ui.Components;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.ui.ActionBar.Theme;
public class Tooltip extends TextView {
private View anchor;
private ViewPropertyAnimator animator;
private boolean showing;
Runnable dismissRunnable = () -> {
animator = animate().alpha(0).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
setVisibility(View.GONE);
}
}).setDuration(300);
animator.start();
};
public Tooltip(Context context, ViewGroup parentView, int backgroundColor, int textColor) {
super(context);
setBackgroundDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(3), backgroundColor));
setTextColor(textColor);
setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(7), AndroidUtilities.dp(8), AndroidUtilities.dp(7));
setGravity(Gravity.CENTER_VERTICAL);
parentView.addView(this, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 5, 0, 5, 3));
setVisibility(GONE);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
updateTooltipPosition();
}
private void updateTooltipPosition() {
if (anchor == null) {
return;
}
int top = 0;
int left = 0;
View containerView = (View) getParent();
View view = anchor;
while (view != containerView) {
top += view.getTop();
left += view.getLeft();
view = (View) view.getParent();
}
int x = left + anchor.getWidth() / 2 - getMeasuredWidth() / 2;
if (x < 0) {
x = 0;
} else if (x + getMeasuredWidth() > containerView.getMeasuredWidth()) {
x = containerView.getMeasuredWidth() - getMeasuredWidth() - AndroidUtilities.dp(16);
}
setTranslationX(x);
int y = top - getMeasuredHeight();
setTranslationY(y);
}
public void show(View anchor) {
if (anchor == null) {
return;
}
this.anchor = anchor;
updateTooltipPosition();
showing = true;
AndroidUtilities.cancelRunOnUIThread(dismissRunnable);
AndroidUtilities.runOnUIThread(dismissRunnable, 2000);
if (animator != null) {
animator.setListener(null);
animator.cancel();
animator = null;
}
if (getVisibility() != VISIBLE) {
setAlpha(0f);
setVisibility(VISIBLE);
animator = animate().setDuration(300).alpha(1f).setListener(null);
animator.start();
}
}
public void hide() {
if (showing) {
if (animator != null) {
animator.setListener(null);
animator.cancel();
animator = null;
}
AndroidUtilities.cancelRunOnUIThread(dismissRunnable);
dismissRunnable.run();
}
showing = false;
}
}