下面列出了android.view.ViewTreeObserver#addOnPreDrawListener ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public void setImageBitmap(Bitmap bm) {
// TODO Auto-generated method stub
super.setImageBitmap(bm);
//大小为0 表示当前控件大小未测量 设置监听函数 在绘制前赋值
if(getWidth()==0){
ViewTreeObserver vto = getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
{
public boolean onPreDraw()
{
initData();
//赋值结束后,移除该监听函数
MatrixImageView.this.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
});
}else {
initData();
}
}
public static void calculateTag1(TextView first, TextView second, final String text) {
ViewTreeObserver observer = first.getViewTreeObserver();
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
Layout layout = first.getLayout();
int lineEnd = layout.getLineEnd(0);
String substring = text.substring(0, lineEnd);
String substring1 = text.substring(lineEnd, text.length());
Log.i("TAG", "onGlobalLayout:" + "+end:" + lineEnd);
Log.i("TAG", "onGlobalLayout: 第一行的内容::" + substring);
Log.i("TAG", "onGlobalLayout: 第二行的内容::" + substring1);
if (TextUtils.isEmpty(substring1)) {
second.setVisibility(View.GONE);
second.setText(null);
} else {
second.setVisibility(View.VISIBLE);
second.setText(substring1);
}
first.getViewTreeObserver().removeOnPreDrawListener(
this);
return false;
}
});
}
private void init() {
ViewTreeObserver observer = getViewTreeObserver();
if (observer != null) {
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (isDirty()) {
// 只在需要绘制的时候刷新
if (mRenderMode == GLSurfaceView.RENDERMODE_WHEN_DIRTY) {
invalidate();
}
}
return true;
}
});
}
}
private void fixLayout() {
ViewTreeObserver obs = fragmentView.getViewTreeObserver();
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (fragmentView == null) {
return true;
}
fragmentView.getViewTreeObserver().removeOnPreDrawListener(this);
WindowManager manager = (WindowManager) ApplicationLoader.applicationContext.getSystemService(Context.WINDOW_SERVICE);
int rotation = manager.getDefaultDisplay().getRotation();
if (rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90) {
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
} else {
linearLayout.setOrientation(LinearLayout.VERTICAL);
}
fragmentView.setPadding(fragmentView.getPaddingLeft(), 0, fragmentView.getPaddingRight(), fragmentView.getPaddingBottom());
return true;
}
});
}
@Override
public void onConfigurationChanged(android.content.res.Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (listView != null)
{
ViewTreeObserver obs = listView.getViewTreeObserver();
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
{
@Override
public boolean onPreDraw()
{
listView.getViewTreeObserver().removeOnPreDrawListener(this);
fixLayoutInternal();
return true;
}
});
}
}
private void fixLayout()
{
if (listView != null)
{
ViewTreeObserver obs = listView.getViewTreeObserver();
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
{
@Override
public boolean onPreDraw()
{
fixLayoutInternal();
if (listView != null)
{
listView.getViewTreeObserver().removeOnPreDrawListener(this);
}
return true;
}
});
}
}
private void fixLayout() {
if (listView != null) {
ViewTreeObserver obs = listView.getViewTreeObserver();
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
fixLayoutInternal();
if (listView != null) {
listView.getViewTreeObserver().removeOnPreDrawListener(this);
}
return true;
}
});
}
}
private void leHide(final boolean hide, final boolean animated, final boolean deferred) {
if (mHide != hide || deferred) {
mHide = hide;
final int height = mView.getHeight();
if (height == 0 && !deferred) {
// Dang it, haven't been drawn before, defer! defer!
final ViewTreeObserver vto = mView.getViewTreeObserver();
if (vto.isAlive()) {
vto.addOnPreDrawListener(new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
// Sometimes is not the same we used to know
final ViewTreeObserver currentVto = mView.getViewTreeObserver();
if (currentVto.isAlive()) {
currentVto.removeOnPreDrawListener(this);
}
leHide(hide, animated, true);
return true;
}
});
return;
}
}
int marginBottom = 0;
final ViewGroup.LayoutParams layoutParams = mView.getLayoutParams();
if (layoutParams instanceof ViewGroup.MarginLayoutParams) {
marginBottom = ((ViewGroup.MarginLayoutParams) layoutParams).bottomMargin;
}
final int translationY = mHide ? height + marginBottom : 0;
if (animated) {
mView.animate()
.setInterpolator(mInterpolator)
.setDuration(mDuration)
.translationY(translationY);
} else {
mView.setTranslationY(translationY);
}
}
}
private void toggle(final boolean visible, final boolean animate, boolean force) {
if (mVisible != visible || force) {
mVisible = visible;
int height = getHeight();
if (height == 0 && !force) {
ViewTreeObserver vto = getViewTreeObserver();
if (vto.isAlive()) {
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
ViewTreeObserver currentVto = getViewTreeObserver();
if (currentVto.isAlive()) {
currentVto.removeOnPreDrawListener(this);
}
toggle(visible, animate, true);
return true;
}
});
return;
}
}
int translationY = visible ? 0 : height + getMarginBottom();
if (animate) {
animate().setInterpolator(mInterpolator)
.setDuration(TRANSLATE_DURATION_MILLIS)
.translationY(translationY);
} else {
setTranslationY(translationY);
}
// On pre-Honeycomb a translated view is still clickable, so we need to disable clicks manually
if (!Utils.hasHoneycomb()) {
setClickable(visible);
}
}
if(isMenuOpen()) {
closeMenu();
}
}
private void fixLayout() {
if (listView != null) {
ViewTreeObserver obs = listView.getViewTreeObserver();
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
fixLayoutInternal();
if (listView != null) {
listView.getViewTreeObserver().removeOnPreDrawListener(this);
}
return true;
}
});
}
}
public static MoveData startAnimation(Context context, final View toView, Bundle transitionBundle, Bundle savedInstanceState, final int duration, final TimeInterpolator interpolator) {
final TransitionData transitionData = new TransitionData(context, transitionBundle);
if (transitionData.imageFilePath != null) {
setImageToView(toView, transitionData.imageFilePath);
}
final MoveData moveData = new MoveData();
moveData.toView = toView;
moveData.duration = duration;
if (savedInstanceState == null) {
ViewTreeObserver observer = toView.getViewTreeObserver();
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
toView.getViewTreeObserver().removeOnPreDrawListener(this);
int[] screenLocation = new int[2];
toView.getLocationOnScreen(screenLocation);
moveData.leftDelta = transitionData.thumbnailLeft - screenLocation[0];
moveData.topDelta = transitionData.thumbnailTop - screenLocation[1];
moveData.widthScale = (float) transitionData.thumbnailWidth / toView.getWidth();
moveData.heightScale = (float) transitionData.thumbnailHeight / toView.getHeight();
runEnterAnimation(moveData, interpolator);
return true;
}
});
}
return moveData;
}
/**
* 交换item,并且控制item之间的显示与隐藏效果
*
* @param moveX
* @param moveY
*/
private void onSwapItem(int moveX, int moveY) {
// 获取我们手指移动到的那个item的position
final int tempPosition = pointToPosition(moveX, moveY);
// 假如tempPosition 改变了并且tempPosition不等于-1,则进行交换
if (tempPosition != mDragPosition
&& tempPosition != AdapterView.INVALID_POSITION
&& mAnimationEnd) {
mDragAdapter.reorderItems(mDragPosition, tempPosition);
mDragAdapter.setHideItem(tempPosition);
final ViewTreeObserver observer = getViewTreeObserver();
observer.addOnPreDrawListener(new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
observer.removeOnPreDrawListener(this);
animateReorder(mDragPosition, tempPosition);
mDragPosition = tempPosition;
return true;
}
});
}
}
private void toggle(final boolean visible, final boolean animate, boolean force) {
if (mVisible != visible || force) {
mVisible = visible;
int height = getHeight();
if (height == 0 && !force) {
ViewTreeObserver vto = getViewTreeObserver();
if (vto.isAlive()) {
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
ViewTreeObserver currentVto = getViewTreeObserver();
if (currentVto.isAlive()) {
currentVto.removeOnPreDrawListener(this);
}
toggle(visible, animate, true);
return true;
}
});
return;
}
}
int translationY = visible ? 0 : height + mAddButton.getMarginBottom();
if (animate) {
ViewPropertyAnimator.animate(this).setInterpolator(mInterpolator)
.setDuration(TRANSLATE_DURATION_MILLIS)
.translationY(translationY);
} else {
ViewHelper.setTranslationY(this, translationY);
}
// On pre-Honeycomb a translated view is still clickable, so we need to disable clicks manually
if (!hasHoneycombApi()) {
setClickable(visible);
}
}
}
public static void postOnPreDraw(View view, final Runnable runnable) {
final ViewTreeObserver observer = view.getViewTreeObserver();
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (observer.isAlive()) {
observer.removeOnPreDrawListener(this);
}
runnable.run();
return true;
}
});
}
private void toggle(final boolean visible, final boolean animate, boolean force) {
if (mVisible != visible || force) {
mVisible = visible;
int height = getHeight();
if (height == 0 && !force) {
ViewTreeObserver vto = getViewTreeObserver();
if (vto.isAlive()) {
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
ViewTreeObserver currentVto = getViewTreeObserver();
if (currentVto.isAlive()) {
currentVto.removeOnPreDrawListener(this);
}
toggle(visible, animate, true);
return true;
}
});
return;
}
}
int translationY = visible ? 0 : height + getMarginBottom();
if (animate) {
ViewPropertyAnimator.animate(this).setInterpolator(mInterpolator)
.setDuration(TRANSLATE_DURATION_MILLIS)
.translationY(translationY);
} else {
ViewHelper.setTranslationY(this, translationY);
}
// On pre-Honeycomb a translated view is still clickable, so we need to disable clicks manually
if (!hasHoneycombApi()) {
setClickable(visible);
}
}
}
private void fixLayout() {
if (listView != null) {
ViewTreeObserver obs = listView.getViewTreeObserver();
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
fixLayoutInternal();
if (listView != null) {
listView.getViewTreeObserver().removeOnPreDrawListener(this);
}
return true;
}
});
}
}
public static MoveData startAnimation(final View toView, Bundle transitionBundle, Bundle savedInstanceState, final int duration, final TimeInterpolator interpolator, final Animator.AnimatorListener listener) {
Context context = toView.getContext();
if (context instanceof ContextThemeWrapper) {
context = ((ContextThemeWrapper) context).getBaseContext();
}
final TransitionData transitionData = new TransitionData(context, transitionBundle);
if (transitionData.imageFilePath != null) {
setImageToView(toView, transitionData.imageFilePath);
}
final MoveData moveData = new MoveData();
moveData.toView = toView;
moveData.duration = duration;
if (savedInstanceState == null) {
ViewTreeObserver observer = toView.getViewTreeObserver();
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
toView.getViewTreeObserver().removeOnPreDrawListener(this);
int[] screenLocation = new int[2];
toView.getLocationOnScreen(screenLocation);
moveData.leftDelta = transitionData.thumbnailLeft - screenLocation[0];
moveData.topDelta = transitionData.thumbnailTop - screenLocation[1];
moveData.widthScale = (float) transitionData.thumbnailWidth / toView.getWidth();
moveData.heightScale = (float) transitionData.thumbnailHeight / toView.getHeight();
runEnterAnimation(moveData, interpolator, listener);
return true;
}
});
}
return moveData;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_main);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(getResources().getColor(R.color.background));
}
mLayoutInflater = LayoutInflater.from(this);
TextView cidView = (TextView) findViewById(R.id.cid);
cidView.setOnClickListener(this);
TextView pwdView = (TextView) findViewById(R.id.pwd);
pwdView.setOnClickListener(this);
TextView statusView = (TextView) findViewById(R.id.logState);
TextView deviceName = (TextView) findViewById(R.id.deviceName);
ImageView barCodeView = (ImageView) findViewById(R.id.barcode);
ImageView menuView = (ImageView) findViewById(R.id.menu);
menuView.setOnClickListener(this);
menu_layout = (LinearLayout) findViewById(R.id.menu_layout);
menu_layout.setOnClickListener(this);
findViewById(R.id.main_layout).setOnClickListener(this);
findViewById(R.id.help).setOnClickListener(this);
findViewById(R.id.feedback).setOnClickListener(this);
findViewById(R.id.about).setOnClickListener(this);
findViewById(R.id.disclaimer).setOnClickListener(this);
findViewById(R.id.avs_title).setOnClickListener(this);
mMyAvsHelper = new MyAvsHelper(getApplicationContext());
mMyAvsHelper.setViews(cidView, pwdView, statusView, deviceName, barCodeView);
mMyAvsHelper.login();
final int[] size = mMyAvsHelper.getVideoSize();
mMediaSurfaceView = (MediaSurfaceView) findViewById(R.id.cameraView);
mMediaSurfaceView.openCamera(mMyAvsHelper);
ViewTreeObserver viewTreeObserver = mMediaSurfaceView.getViewTreeObserver();
viewTreeObserver.addOnPreDrawListener(new OnPreDrawListener(){
@Override
public boolean onPreDraw(){
if (isFirst){
int height = mMediaSurfaceView.getMeasuredHeight();
int width = mMediaSurfaceView.getMeasuredWidth();
float r = (float)height/(float)width;
float r2 = (float)size[1]/(float)size[0];
RelativeLayout.LayoutParams pvLayout = (RelativeLayout.LayoutParams) mMediaSurfaceView.getLayoutParams();
if (r > r2){
pvLayout.height = (int) (width*r2);
}else{
pvLayout.width = (int) (height/r2);
}
isFirst = false;
}
return true;
}
});
mShowChinese = "zh".equals(Locale.getDefault().getLanguage().toLowerCase());
//update
UmengUpdateAgent.setUpdateOnlyWifi(false);
UmengUpdateAgent.update(this);
}
private void waitForNextFrame() {
ViewTreeObserver treeObserver = getViewTreeObserver();
if (treeObserver != null && treeObserver.isAlive()) {
treeObserver.addOnPreDrawListener(new PreDrawListener());
}
}
private void waitForNextFrame() {
ViewTreeObserver treeObserver = getViewTreeObserver();
if (treeObserver != null && treeObserver.isAlive()) {
treeObserver.addOnPreDrawListener(new PreDrawListener());
}
}