package com.circlegate.liban.utils;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.TextView;
public class ViewUtils {
private static float baseScale = 1;
public static void setBaseScale(float baseScale) {
ViewUtils.baseScale = baseScale;
}
public static int getScaledDensityDpi(Context context) {
return (int)((context.getResources().getDisplayMetrics().densityDpi * baseScale) + 0.5f);
}
public static int getPixelsFromDp(Context context, float dp) {
return getPixelsFromDp(context, dp, baseScale);
}
public static int getPixelsFromDp(Context context, float dp, float baseScale) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) ((dp * scale * baseScale) + 0.5f);
}
public static float getPixelsFromSp(Context context, float sp) {
final float scale = context.getResources().getDisplayMetrics().scaledDensity;
return sp * scale * baseScale;
}
public static void setTextOrHide(TextView textView, CharSequence text) {
if (!TextUtils.isEmpty(text)) {
textView.setVisibility(TextView.VISIBLE);
textView.setText(text);
}
else
textView.setVisibility(TextView.GONE);
}
@SuppressWarnings("deprecation")
public static void setBackgroundDrawableKeepPadding(View view, Drawable drawable) {
int left = view.getPaddingLeft();
int top = view.getPaddingTop();
int right = view.getPaddingRight();
int bottom = view.getPaddingBottom();
view.setBackgroundDrawable(drawable);
view.setPadding(left, top, right, bottom);
}
public static void setBackgroundResourceKeepPadding(View view, int resid) {
int left = view.getPaddingLeft();
int top = view.getPaddingTop();
int right = view.getPaddingRight();
int bottom = view.getPaddingBottom();
view.setBackgroundResource(resid);
view.setPadding(left, top, right, bottom);
}
public static int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
int result = size;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch (specMode) {
case MeasureSpec.UNSPECIFIED:
result = size;
break;
case MeasureSpec.AT_MOST:
if (specSize < size) {
result = specSize | View.MEASURED_STATE_TOO_SMALL;
} else {
result = size;
}
break;
case MeasureSpec.EXACTLY:
result = specSize;
break;
}
return result | (childMeasuredState & View.MEASURED_STATE_MASK);
}
public static void addOnGlobalLayoutCalledOnce(final View view, final OnGlobalLayoutListener l) {
view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ViewTreeObserver vto = view.getViewTreeObserver();
if (vto != null && vto.isAlive()) {
if (VERSION.SDK_INT < VERSION_CODES.JELLY_BEAN)
vto.removeGlobalOnLayoutListener(this);
else
vto.removeOnGlobalLayoutListener(this);
}
l.onGlobalLayout();
}
});
}
public static void addOnTextChangedAndLayout(final TextView view, final OnTextChangedAndLayoutListener listener) {
view.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (view.getLineCount() <= 0) {
ViewUtils.addOnGlobalLayoutCalledOnce(view, new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
listener.onTextChangedAndLayout(view);
}
});
} else
listener.onTextChangedAndLayout(view);
}
});
}
public interface OnTextChangedAndLayoutListener {
void onTextChangedAndLayout(TextView view);
}
}