SORU
19 Aralık 2010, Pazar


Sistem kaplama pencere (her zaman üstte)oluşturma

-Görüntü tıklanabilir/hep-op-üst bir düğme oluşturmak için çalışıyorum Tüm pencereleri her zaman üstte kalır.

Kanıtı kavramdır

Ben Android kaynak kodundan bu örnek kod aşağıdaki

Başarılı ve çalışan bir servis var artık. Hizmet metin üstünde görüntüler her zaman ekranın sol köşesine kullanıcı serbestçe normal şekilde apps geri kalanı ile etkileşim.

Benim demek istediğim işin alt ViewGroup ve pencere yöneticisi kök Ekle bayrak 5**. Şimdi tıklanabilir görüntü/bir düğme eklemek istiyorum kendisini dokunma olayları ve alabilirsiniz bu metin yerine. Ben "bütün ViewGroup ama "onTouchEvent ağır basan çalıştı herhangi bir alma olayı.

Nasıl sadece belirli yerlerinde olayların alabilir miyim her zaman-on-top benim bakış grup? Lütfen öneririz.

public class HUD extends Service {
    HUDView mView;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(getBaseContext(),"onCreate", Toast.LENGTH_LONG).show();
        mView = new HUDView(this);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                0,
//              WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
//                      | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.RIGHT | Gravity.TOP;
        params.setTitle("Load Average");
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.addView(mView, params);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(getBaseContext(),"onDestroy", Toast.LENGTH_LONG).show();
        if(mView != null)
        {
            ((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(mView);
            mView = null;
        }
    }
}

class HUDView extends ViewGroup {
    private Paint mLoadPaint;

    public HUDView(Context context) {
        super(context);
        Toast.makeText(getContext(),"HUDView", Toast.LENGTH_LONG).show();

        mLoadPaint = new Paint();
        mLoadPaint.setAntiAlias(true);
        mLoadPaint.setTextSize(10);
        mLoadPaint.setARGB(255, 255, 0, 0);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawText("Hello World", 5, 15, mLoadPaint);
    }

    @Override
    protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //return super.onTouchEvent(event);
        Toast.makeText(getContext(),"onTouchEvent", Toast.LENGTH_LONG).show();
        return true;
    }
}

CEVAP
19 Aralık 2010, Pazar


Bu aptalca bir çözüm olabilir. Ama işe yarıyor. Eğer geliştirmek eğer, lütfen bana bildirin.

Hizmet OnCreate: WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH bayrak kullandım. Bu hizmet yalnızca değişimdir.

@Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(getBaseContext(),"onCreate", Toast.LENGTH_LONG).show();
        mView = new HUDView(this);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.RIGHT | Gravity.TOP;
        params.setTitle("Load Average");
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.addView(mView, params);
    }

Şimdi, her tıklama olayı elde başlayacak. Yani, bir olay işleyicisi içinde düzeltmek gerekir.

ViewGroup dokunmatik olayı

@Override
public boolean onTouchEvent(MotionEvent event) {

    // ATTENTION: GET THE X,Y OF EVENT FROM THE PARAMETER
    // THEN CHECK IF THAT IS INSIDE YOUR DESIRED AREA


    Toast.makeText(getContext(),"onTouchEvent", Toast.LENGTH_LONG).show();
    return true;
}

Ayrıca bildirim için bu izni eklemek gerekebilir:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Howard Pinsky

    Howard Pinsk

    6 AĞUSTOS 2006
  • International Secret Agents Concerts

    Internationa

    2 Aralık 2008
  • Megan Parken

    Megan Parken

    19 Temmuz 2009