区域计算

2022-01-02  本文已影响0人  Ford_


package com.vivo.circle;

import android.annotation.TargetApi;
import android.app.KeyguardManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Rect;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@TargetApi(Build.VERSION_CODES.CUPCAKE)
public class IViweMonitor implements ViewTreeObserver.OnGlobalLayoutListener, ViewTreeObserver.OnScrollChangedListener {
private static final String TAG = IViweMonitor.class.getSimpleName();
private static final Map<View, IViweMonitor> MONITOR_MAP = new ConcurrentHashMap<View, IViweMonitor>();
private View view;
private boolean viewHasShown;
private long showStartTime;
private int maxShowAreaPercentage;
private Rect visibleRect = new Rect();
private boolean screenAvailable = true;
private boolean needObserver = true;
private BroadcastReceiver screenReceiverToRegister;
private BroadcastReceiver screenStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (null == intent) {
return;
}
Log.e(TAG, "---333---");
String action = intent.getAction();
if (TextUtils.equals(Intent.ACTION_SCREEN_ON, action) || TextUtils.equals(Intent.ACTION_SCREEN_OFF, action) ||
TextUtils.equals(Intent.ACTION_USER_PRESENT, action)) {
Log.e(TAG, "---444---");
checkScreenState();
checkViewVisibilityAndShowArea();
}
}
};

public IViweMonitor(View view, boolean needObserver) {
    this.view = view;
    this.needObserver = needObserver;
}

public void registerObservers() {
    if (null == view) {
        return;
    }
    Log.e(TAG, "---222---");
    ViewTreeObserver viewTreeObserver = this.view.getViewTreeObserver();
    IViweMonitor oldMonitor = MONITOR_MAP.get(view);
    if (oldMonitor != null && viewTreeObserver.isAlive()) {
        viewTreeObserver.removeOnScrollChangedListener(this);
        viewTreeObserver.removeOnGlobalLayoutListener(this);
    }
    MONITOR_MAP.put(view, this);
    if (needObserver && viewTreeObserver.isAlive()) {
        viewTreeObserver.addOnScrollChangedListener(this);
        viewTreeObserver.addOnGlobalLayoutListener(this);
    }
    IntentFilter screenIntentFilter = new IntentFilter();
    screenIntentFilter.addAction(Intent.ACTION_SCREEN_ON);
    screenIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
    screenIntentFilter.addAction(Intent.ACTION_USER_PRESENT);
    screenReceiverToRegister = screenStateReceiver;
    view.getContext().registerReceiver(screenReceiverToRegister, screenIntentFilter);
    screenAvailable = true;
}

private void checkScreenState() {
    Context context = view.getContext();
    boolean screenInteractive = false;
    KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
    boolean screenLocked = keyguardManager.inKeyguardRestrictedInputMode();
    screenAvailable = screenInteractive && !screenLocked;
}

private void unregisterObservers() {
}

public void onViewAttachedToWindow() {
    registerObservers();
    checkViewVisibilityAndShowArea();
}

public void onViewDetachedFromWindow() {
    unregisterObservers();
    onViewHidden();
}

private void checkViewVisibilityAndShowArea() {
    boolean visible = screenAvailable && view.isShown() && view.getLocalVisibleRect(visibleRect);
    int viewArea = view.getWidth() * view.getHeight();
    if (visible && viewArea > 0) {
        int visibleArea = visibleRect.width() * visibleRect.height();
        int areaPercentage = visibleArea * 100 / viewArea;
        if (areaPercentage > maxShowAreaPercentage) {
            maxShowAreaPercentage = areaPercentage;
        }
        onUpdateViewShowArea(areaPercentage);
        if (areaPercentage <= 0) {
            visible = false;
        }
    }
    if (visible) {
        onViweShown();
    } else {
        onViewHidden();
    }
}

public void onViweShown() {
    Log.e(TAG, "show:"+viewHasShown);
    if (viewHasShown) {
        return;
    }
    viewHasShown = true;
    showStartTime = System.currentTimeMillis();
    onViewShowStart();
}

public void onViewHidden() {
    Log.e(TAG, "hidden:"+viewHasShown);
    if (!viewHasShown) {
        return;
    }
    viewHasShown = false;
    long showEndTime = System.currentTimeMillis();
    long duration = showEndTime - showStartTime;
    onViewShowEnd(duration, maxShowAreaPercentage);
    maxShowAreaPercentage = 0;
}

private void onViewShowEnd(long duration, int maxShowAreaPercentage) {
    Log.e(TAG, "结束:" + duration + "毫秒  " + maxShowAreaPercentage);
}

public void onUpdateViewShowArea(int percentage) {
    Log.e(TAG, "更新:" + percentage);
}

public void onViewShowStart() {

}

@Override
public void onGlobalLayout() {
    checkViewVisibilityAndShowArea();
}

@Override
public void onScrollChanged() {
    checkViewVisibilityAndShowArea();
}

}

上一篇下一篇

猜你喜欢

热点阅读