0

SurfaceView現在、個人用およびダブル バッファリングを使用して、Android アプリを開発しています。ただし、コードで少し問題に直面しています。一方で、階層
に基づく xml ビューがあります。アクティビティをインスタンス化するとき、この xml にLinearLayoutmy を設定します。contentView問題は、ダブルバッファリングが機能しなくなったことです。スレッドは実行中ですが、何も表示されません。
一方、contentView新しい個人的なSurfaveView要素を設定すると、ディスプレイは正常に動作します。しかしもちろん、 my の他の要素にはもうアクセスできませんLinearLayout

実際、私はcontentView自分の xml ビューを設定し、ディスプレイを機能させ続けたいと思っています

私は十分に明確だったと思います、あなたの答えをありがとう!

ここに私の活動があります:

public class MainController extends Activity {
    @Override
    protected void onCreate(final Bundle p_savedInstanceState) {
        super.onCreate(p_savedInstanceState);
        setContentView(R.layout.main_controller_activity);

        this.drawableView = (MCustomDrawableView) findViewById(R.id.drawingBox);

        ...
    }
    ...
}

私の表面ビュー:

public class MCustomDrawableView extends SurfaceView {
    public MCustomDrawableView(Context p_context, AttributeSet p_attributes) {
        super(p_context, p_attributes);

        this.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(final SurfaceHolder p_holder) {
                try {
                    // Instantiating a new thread
                    thread = new MBufferingThread(getInstance());

                    thread.start();

                } catch (Exception exception) {
                    exception.printStackTrace();
                }
            }

            @Override
            public void surfaceChanged(final SurfaceHolder p_holder, int p_format, int p_width, int p_height) {...}

            @Override
            public void surfaceDestroyed(final SurfaceHolder p_holder) {...}
        });

        // Setup drawing options
        setupDrawing();
    }
    ...
}

そして私のxmlビュー:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:background="@color/app_background"
    tools:context=".MainController">

    <com.iskn.calligraphy.models.draw.MCustomDrawableView
        android:id="@+id/drawingBox"
        style="@style/DrawingBox" />

    <SeekBar
        android:id="@+id/brushSize"
        style="@style/SizeSeekBar" />

    <SeekBar
        android:id="@+id/brushOpacity"
        style="@style/OpacitySeekBar" />

</LinearLayout>

編集:
さらなる調査と分析の後、次のことが明らかになりました。

  • setContentView(R.layout.main_controller_activity): この場合、アクティビティからすべての要素を取得しますが、MCustomDrawableView何も表示されません。
  • setContentView(new MCustomDrawableView(getApplicationContext())):その場合、MCustomDrawableViewうまく機能しています(必要なものが表示されます)が、他のものはありませViewmain_controller_activity

両方の場合において:

  • 私のスレッドは実行されており、うまく機能しています。
  • holder.lockCanvas()およびメソッドを使用して、私の描画関数も呼び出されholder.unlockCanvasAndPost(bufferCanvas)ます。
4

1 に答える 1

0

さて、私は機能的な解決策を見つけました:

問題は初期化から来ていたと思いMCustomDrawableViewます。onCreatexml ファイルからではなく、メソッドからそのクラスの新しいインスタンスを作成しました。次に、次のように設定しますcontentView

   protected void onCreate(Bundle p_savedInstanceState) {
        super.onCreate(p_savedInstanceState);
        setContentView(R.layout.main_controller_activity);

        // Instantiate drawable object & set style properties
        this.drawableView = new MCustomDrawableView(getApplicationContext());
        FrameLayout.LayoutParams style = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                FrameLayout.LayoutParams.MATCH_PARENT);

        // Add the drawable view to the main_activity
        addContentView(this.drawableView, style);
    } 

しかし、この方法は新たな問題を引き起こします。追加されたビューが一番上に表示されます。これは、他のすべてのビューが非表示になっていることを意味しますViewbringToBack(this.drawableView)以下の方法でこれを解決しました:

private void bringToBack(View p_view) {
    // Get parent from the current view
    ViewGroup viewGroup = ((ViewGroup) p_view.getParent());

    int childrenCount = viewGroup.indexOfChild(p_view);
    for(int cpt = 0; cpt < childrenCount; cpt++) {
        // Move the child to the top
        viewGroup.bringChildToFront(viewGroup.getChildAt(cpt));
    }
}

提供されたビューをバックグラウンド位置に戻します。また、LinearLayout のアルファを 0 に設定する必要がありました。

私はまだ他の解決策を受け入れています!

于 2015-01-08T11:12:12.787 に答える