2013-04-28 24 views
13

Şu anda görüntülenen herhangi bir şeyin üstünde ekranda bildirim oluşturabilen bir uygulama yapmak istiyorum. Aşağıdaki resimde ChatHead gibi git SMS mesajı açılır falan gibi bir şey: dinamik dokunmatik events.What dahil çizmek mümkün olup olmadığınıHer şeyin üstünde bir görünüm nasıl çizilir?

enter image description here

Hatta daha iyi olurdu geleneksel veya standart bir yoldur Bunu yapmak için?

Örnek: tıklandığında veya ekranın kenarlarına yakın dairesel simgeler ana ekranın veya uygulama çekmece veya diğer apps.Pay dikkat olmalarından bağımsız olursa olsun sürüklenebilir bir simge gibi

resim gönderildi. Herhangi bir uygulamada istediğiniz yere sürükleyebilirsiniz.

+0

Bu sorunun yanıtına bakın: http://stackoverflow.com/questions/2176922/how-to-create-transparent-activity-in-android – Jules

+0

Tüm saydam olayları şeffaf olarak kullanamazsınız? – Allahjane

+0

Evet, ancak başka bir etkinliğin tepesine çekiyorsanız, genellikle istediğiniz şey budur. Kullanıcı dışarıya dokunursa görüşünüzü reddedin benim tavsiyem olur. – Jules

cevap

8

Bunu yapmak için yeni bir aktiviteye ihtiyacınız yok. Yapmanız gereken tek şey var olan aktivitenize yeni bir görünüm eklemek ve onu öne getirmek ve o görünüme istediğiniz şeyleri çizmek/yazmaktır. , Bu ekstra görünümü ile özel şeyler yapmak istiyorsanız

, kendi bakış sınıf

class DrawOnTop extends View { 
    public DrawOnTop(Context activity) { 
     super(activity); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // put your drawing commands here 
    } 

} 

oluşturabilir ve sonra

DrawOnTop mDraw = new DrawOnTop(this); 
addContentView(mDraw, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
mDraw.bringToFront(); 

Sonra çizmek zorlamak gibi bir şey mDraw.invalidate() öğesini kullanmanız gerekir;

+0

Ekrandaki veya uygulama menüleri veya diğer uygulamalarda olsanız da tıklanabilir veya sürüklenebilir bir simge gibi – Allahjane

+0

Bir aktivitede ana görünümün üstüne metin ve bitmapler çizmek için gönderdiğim şeyi kullanıyorum. Benim tahminim, siz de önerdiğin şeyi yapmak için kullanabilirsin. – Stochastically

+0

Üzgünüm, sorumu yanlış yola koyduğumu düşünüyorum! Kendi uyguladığım diğer uygulamalar üzerinde çizim yapmak istiyorum – Allahjane

1

Tüm düzeninizin ebeveyni RelativeLayout olarak sahip olabilirsiniz. İlk çocuk ana düzeninizin "kök" üdür. Bundan sonra herhangi bir şey, kaprislerinize yerleşebilen bir bindirme olarak düşünülebilir.

Örnek:

Aradığınız Ne
<RelativeLayout> 
    <LinearLayout> 
    ... Main Layout here ... 
    </LinearLayout> 

    <TextView left="20dip" top="20dip" text="Overlay" alpha="0.7" /> 
</RelativeLayout> 
+0

Sen haklısın ama benim durumumda ben ana ekran vb gibi diğer uygulamalar üstüne çizim yapıyorum – Allahjane

+0

Ah. O zaman bu işe yaramaz. – Knossos

9

Sistem Uyarısı Pencere olduğunu.

StandOut adlı bir kütüphane var! Bu tür uygulamalar oluştururken size yardımcı olacaktır. Bir hizmeti yaşıyorsanız zaman

sadece ekleyerek veya çalışmıyor öne getiren durumda

, başka bir istemci etkinliği veya uygulamaya kendi görünüm eklemek ki: İşte

9

Toast ve iletişim pencere gibi işlerin nasıl olduğunu (FaceUnlock bunu yapar) veya hiyerarşilere güvenemezsiniz, hile yapmak için pencere yöneticisini ve bir pencere belirtecini kullanmanız gerekir. Daha sonra, düzenleri oluşturabilir ve daha önce olduğu gibi animasyon ve donanım hızlandırmasından yararlanabilirsiniz.

WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE); 

    WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.FIRST_SUB_WINDOW); 
    layoutParams.width = 300; 
    layoutParams.height = 300; 

    layoutParams.format = PixelFormat.RGBA_8888; 
    layoutParams.flags = 
      WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 
        | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; 
    layoutParams.token = getWindow().getDecorView().getRootView().getWindowToken(); 

    //Feel free to inflate here 
    mTestView = new View(this); 
    mTestView.setBackgroundColor(Color.RED); 

    //Must wire up back button, otherwise it's not sent to our activity 
    mTestView.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_BACK) { 
       onBackPressed(); 
      } 
      return true; 
     } 
    }); 
    windowManager.addView(mTestView, layoutParams); 

Sonra görünümü OnDestroy kaldırmak için emin (veya OnPause) olmak veya

if (mTestView != null) { 
     WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE); 
     if (mTestView.isShown()) { 
      windowManager.removeViewImmediate(mTestView); 
     } 
    } 
1

en iyi yolu uygulama ile bir hizmeti başlamaktır kilitlenmesine. Bir ImageView oluşturun. Görüntü Görünümünün LayoutParams öğesini ayarlayın. Görünümü, hizmet oluşturulduğunda pencere yöneticisine paramiklerle birlikte ekleyin.

ALL SET Uygulamanız, siz kapatılana kadar pencerenize (tüm uygulamaların herhangi bir ekranında) yapışır.

Ayrıca, resim listesine onclicklisteners ve ontouchlisteners ekleyebilirsiniz. Ör. Bazı eylemleri gerçekleştirmek için OnClick dinleyicileri ve Ontouchlisteners görüntüyü ekran boyunca hareket ettirir.

İlgili konular