Questo è un metodo che ho usato un po 'nel mio apps e hanno avuto funzionato abbastanza bene per me:
static private int screenW = 0, screenH = 0;
@SuppressWarnings("deprecation") static public boolean onScreen(View view) {
int coordinates[] = { -1, -1 };
view.getLocationOnScreen(coordinates);
// Check if view is outside left or top
if (coordinates[0] + view.getWidth() < 0) return false;
if (coordinates[1] + view.getHeight() < 0) return false;
// Lazy get screen size. Only the first time.
if (screenW == 0 || screenH == 0) {
if (MyApplication.getSharedContext() == null) return false;
Display display = ((WindowManager)MyApplication.getSharedContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
try {
Point screenSize = new Point();
display.getSize(screenSize); // Only available on API 13+
screenW = screenSize.x;
screenH = screenSize.y;
} catch (NoSuchMethodError e) { // The backup methods will only be used if the device is running pre-13, so it's fine that they were deprecated in API 13, thus the suppress warnings annotation at the start of the method.
screenW = display.getWidth();
screenH = display.getHeight();
}
}
// Check if view is outside right and bottom
if (coordinates[0] > screenW) return false;
if (coordinates[1] > screenH) return false;
// Else, view is (at least partially) in the screen bounds
return true;
}
Per usarlo, basta passare in qualsiasi vista o una sottoclasse di vista (IE , quasi tutto ciò che disegna sullo schermo in Android.) Restituirà true
se è sullo schermo o false
se non è ... piuttosto intuitivo, penso.
Se non si sta utilizzando il metodo di cui sopra come statico, allora probabilmente si può ottenere un contesto in qualche altro modo, ma al fine di ottenere il contesto di applicazione da un metodo statico, è necessario fare queste due cose:
1 - Aggiungere il seguente attributo al tag application
nel vostro manifesto:
android:name="com.package.MyApplication"
2 - Aggiungere in una classe che estende applicazione, in questo modo:
public class MyApplication extends Application {
// MyApplication exists solely to provide a context accessible from static methods.
private static Context context;
@Override public void onCreate() {
super.onCreate();
MyApplication.context = getApplicationContext();
}
public static Context getSharedContext() {
return MyApplication.context;
}
}
Ho anche avuto a che fare [questa] (http://stackoverflow.com/questions/7781892/own -defined-layout-ondraw-method-not-getting-called/7784369 # 7784369) affinché funzioni correttamente –