2015-08-06 4 views
2

В настоящее время я пытаюсь создать игру-головоломку, в которой у меня есть сетка, и каждая ячейка должна показывать визуальное (и только визуальное) указание при прикосновении. Поэтому я намерен использовать ViewGroupOverlay (с getOverlay()) с пользовательской точки зрения:ViewGroupOverlay не показывает вид

В каждом CellView

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_DOWN) { 
      LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View myView = inflater.inflate(R.layout.overlay, null); 
      gridView.getOverlay().add(myView); 
     } 
     if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { 
      gridView.getOverlay().clear(); 
     } 
     return super.onTouchEvent(event); 
    } 

где 'GridView' является родителем (а FrameLayout содержащий GridLayout, который содержит несколько CellViews (которые RelativeLayout));). Но я думаю, что на самом деле не имеет значения ...

И в настоящее время для overview.xml (Просто фиктивный код)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#dddd090d"> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:text="Test" /> 

</LinearLayout> 

К сожалению, вид наложения не появляется в любом месте.

Однако, если я пытаюсь его с растяжимой и следующий код в «onTouchEvent», это работает ... Но я должен был бы вид и не вытяжке работать ...

Drawable myIcon = getResources().getDrawable(R.drawable.overlay); 
myIcon.setBounds(0,0,100,100); 
gridView.getOverlay().add(myIcon); 

В общем, технология Overlay, добавленная в API18, кажется, никогда не используется. Какие-нибудь эксперты здесь?

ответ

2

ViewGroupOverlay не выполняет макет передать Просмотры добавленных к нему; то есть, как это автоматически выполняется при добавлении представления в существующий макет, вам необходимо вручную выполнить measure() и layout(), чтобы он был правильно отображен на экране.

Причина, по которой ваш код работает с Drawable, заключается в том, что вы выполняете шаг макета с помощью myIcon.setBounds(0,0,100,100);

Если вы используете этот код вы получите тот же эффект, как ваш Drawable:

View view = inflater.inflate(R.layout.overlay, null); 
    view.measure(View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY)); 
    view.layout(0, 0, 100, 100); 
    gridView.getOverlay().add(view); 

Вы можете прочитать больше о мере/макете здесь: https://developer.android.com/guide/topics/ui/how-android-draws.html

Вы можете использовать этот вспомогательный метод для отображения экрана как если бы он был добавлен в пустой полный экран:

private static void measureAndLayout(Activity activity, View toMeasure, int statusBarHeight) { 
    DisplayMetrics displayMetrics = new DisplayMetrics(); 
    activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 

    toMeasure.measure(
      View.MeasureSpec.makeMeasureSpec(displayMetrics.widthPixels, View.MeasureSpec.EXACTLY) , 
      View.MeasureSpec.makeMeasureSpec(displayMetrics.heightPixels - statusBarHeight, View.MeasureSpec.EXACTLY)); 

    toMeasure.layout(0, statusBarHeight, displayMetrics.widthPixels, displayMetrics.heightPixels); 
} 
Смежные вопросы