9

そのため、多くの検索を行いましたが、SurfaceView が表示されない正確な理由を見つけることができないようです。ここに私がやっていることについての少しの背景があります:

水平に設定された線形レイアウトがあります。これには、ImageView、垂直線形レイアウト、最後に別の ImageView が含まれます。垂直リニア レイアウトには、3 つの重要な要素があります。上部にある別の ImageView、拡張された SurfaceView (MagnetView と呼ばれる)、およびその下にある ImageView です。

xml は次のとおりです。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >

 <!-- Left Magnetrak -->

 <ImageView
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:src="@drawable/vectorparts_01"
    android:adjustViewBounds="true" />

<!-- Middle Linear Layout -->        
<LinearLayout 
    android:layout_width="0dip"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:layout_weight="1">

    <!-- Top Bar with Lifes and Score counter -->
    <RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true">

    <ImageView
    android:adjustViewBounds="true"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/vectorparts_22"/>

    <!-- Score counter -->
    <TextView
    android:id="@+id/myImageViewText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_marginRight="10dp"
    android:layout_marginTop="5dp"
    android:gravity="center"
    android:text="000000000000"
    android:textColor="#000000" />

    <!-- Life1 -->
     <ImageView
        android:id = "@+id/life1"
        android:adjustViewBounds="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/vectorparts_13" 
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="1dp"
        android:gravity="center" />

     <!-- Life2 -->
     <ImageView
        android:id = "@+id/life2"
        android:adjustViewBounds="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/vectorparts_13" 
        android:layout_toRightOf="@id/life1"
        android:layout_marginTop="1dp"
        android:layout_marginLeft="1dp"
        android:gravity="center" />

     <!-- Life3 -->
     <ImageView
        android:id = "@+id/life3"
        android:adjustViewBounds="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/vectorparts_13" 
        android:layout_toRightOf="@id/life2"
        android:layout_marginTop="1dp"
        android:layout_marginLeft="1dp"
        android:gravity="center" />

    </RelativeLayout>

    <!-- SurfaceView -->
    <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/middlesurface">

    </LinearLayout>

     <!-- Bottom Bar -->   
    <RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"> 

    <ImageView
    android:adjustViewBounds="true"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/vectorparts_02"/>


    </RelativeLayout>


</LinearLayout>

<!-- Right Magnetrak -->
   <ImageView
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/vectorparts_01"
android:adjustViewBounds="true" />

基本的には、MagnetView をレイアウトに配置した場所から透けて見える (または穴を開ける) 必要があります。しかし、それは表示されません。実際、SurfaceView が表示されるのは、アクティビティの setContentView() を明示的に SurfaceView に設定し、他のすべてをキャンセルしたときだけです。

実際のアクティビティは次のとおりです。

public class Magnetraks extends Activity {

MagnetView midSurf;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    midSurf = new MagnetView(this);
    LinearLayout midLL = new LinearLayout(this);

    midLL.findViewById(R.id.middlesurface);
    midLL.addView(midSurf);

    setContentView(R.layout.main);

    //Debugging purposes: run to see if middleSurface view is showing up when on its own.
    //setContentView(midSurf);


}

@Override
protected void onResume() {
 // TODO Auto-generated method stub
 super.onResume();
 midSurf.resume();
}

@Override
protected void onPause() {
 // TODO Auto-generated method stub
 super.onPause();
 midSurf.pause();
}

レイアウト xml の上部に SurfaceView を配置する必要がありますか? 他に設定する必要のある属性はありますか? SurfaceView を他のすべての上に重ねて、半透明にして、必要なものを描画することはできますか? SurfaceView がどのように機能するかを理解できないようです。それらは私のビュー階層の一部であるように見えますが、ドキュメントによると、それらはまったく異なるものであることがわかります。

ありがとうございました。

2012年4月17日編集

もう少し情報を提供するには: 私の xml UI デザイナーは、MagnetView と呼ばれる拡張された SurfaceView クラスの中央に大きなボックスを表示します。赤でまとめました。(Stackoverflow ではまだ画像を投稿できません)

UIデザイナービュー(http://24.media.tumblr.com/tumblr_m2mmqvBNwW1qcreoco1_500.jpg) http://24.media.tumblr.com/tumblr_m2mmqvBNwW1qcreoco1_500.jpg

次に、MagnetView (SurfaceView) クラスを示します。

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MagnetView extends SurfaceView implements Runnable, SurfaceHolder.Callback{
Thread mThread;
SurfaceHolder mSurfaceHolder;
volatile boolean running = false;

//Creates new surface view as well as a new surfaceholder, which allows access to the surface
public MagnetView (Context context){
    super(context);

    mSurfaceHolder = getHolder();
            mSurfaceHolder.addCallback(this);
    //this.setZOrderOnTop(true);
    //getHolder().setFormat(PixelFormat.TRANSLUCENT);


}

public void resume(){
    running = true;
    mThread = new Thread(this);
    mThread.start();
}

public void pause(){
       boolean retry = true;
       running = false;
       while(retry){
        try {
         mThread.join();
         retry = false;
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
       }
}

@Override
public void run() {
  // TODO Auto-generated method stub
    while(running){
        if(mSurfaceHolder.getSurface().isValid()){
            Canvas canvas = mSurfaceHolder.lockCanvas();
            //... actual drawing on canvas

            canvas.drawARGB(100, 255, 255, 80);

            mSurfaceHolder.unlockCanvasAndPost(canvas);
        }
    }
}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    this.resume();

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}

}
4

6 に答える 6

17

私はただ変更を書き留めています。

  1. xmlのサーフェスビューをLinearLayoutに置き換えます。

        <LinearLayout 
           android:id="@+id/middleSurface"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
        />
    
  2. 線形レイアウトのインスタンスを取得します

    LinearLayout surface =(LinearLayout)findViewById(R.id.surface);

  3. サーフェスビューのインスタンスをLinearLayoutに追加します

    surface.addView(new MagnetView(this));

setContentView(R.layout.main);の後に2,3ステップを実行する必要があります。

于 2012-04-20T05:15:46.290 に答える
0

私が間違っていなければ、私があなたのクエリを認識した方法は次のとおりです。xmlで言及したように、他のビュー要素とともに、サーフェスビューの上に何かを表示/レンダリングしたいと考えています。

表面ビューの上にビューが必要な場合は、それを拡張する必要があります(私の知る限り、他に方法はありません)。次に、onDraw() メソッドをオーバーライドして、サーフェス ビューに必要なものをすべて表示する必要があります。キャンバスを取得する SurfaceHolder のオブジェクトも取得する必要があります。

これは、表面ビューの上にイメージビューを配置して表示する良いリンクです: http://www.droidnova.com/playing-with-graphics-in-android-part-ii,160.html

于 2012-04-17T09:25:46.470 に答える
0

この別の方法を試すことができますsetContentView(R.layout.main);super.onCreate(savedInstanceState);

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
midSurf = new MagnetView(this);
LinearLayout midLL = new LinearLayout(this);

midLL.findViewById(R.id.middlesurface);
midLL.addView(midSurf);
于 2016-12-27T12:02:56.613 に答える
0
  1. xml からサーフェス ビューを削除し、その代わりに linearlayout を配置して、id を関連付けます。
  2. linearlayout のインスタンスを取得します。
  3. を使用して、子ビュー、つまりこの場合はマグネット ビューを linearlayout に追加します。

    addView()

これで問題は解決しました。

于 2012-04-18T05:31:54.780 に答える
0

Eclipse UI デザイナーでレイアウトを調べて、すべてが希望どおりに配置されているかどうかを確認します。サーフェス ビューは、レイアウトに関しては通常のビューです。

于 2012-04-17T06:19:04.803 に答える
0

SurfaceView の背景を設定しましたか? SurfaceView の背景を設定すると、セカンダリ スレッドで描画したものが表示されないことがわかりました。

于 2014-10-20T12:46:16.720 に答える