2013-02-08 97 views
3

我很努力地找到任何教程來幫助我把一個SurfaceView放在一個盒子裏。一個指向正確方向的指針將會非常驚人,而不是尋找通過它的手。SurfaceView在一個盒子裏

我想能夠在屏幕頂部分配一個區域,例如做按鈕等,然後有一個表面視圖填充其餘部分。但是,當我嘗試修改我用於全屏幕surfaceView的代碼來引用我的xml時,它全部出錯了。

我的主要活動代碼如下(我已經去掉了很多我認爲不相關的部分)。

package com.example.mylistviewidea; 

import android.os.Bundle; 
etc... 

public class MainActivity extends Activity implements OnTouchListener { 

MyListView myListView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    myListView = (MyListView) findViewById(R.id.surfaceView1); 

} 

class MyListView extends SurfaceView implements Runnable { 
    SurfaceHolder myHolder; 
    Thread myThread = null; 
    boolean isRunning = false; 
    // My Variables 
    long dT; 
    int myRed; 

    public MyListView(Context context) { 
     super(context); 
     myHolder = getHolder(); 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     while (isRunning) { 

      if (!myHolder.getSurface().isValid()) 
       continue; 
      Canvas canvas = myHolder.lockCanvas(); 
      canvas.drawARGB(128, 0, 0, 0); 
      dT = SystemClock.uptimeMillis(); 
      myRed = (int) ((int) 128*(1+Math.sin((double) dT/1000))); 

     } 
    } 
} 
} 

我的XML是:

<RelativeLayout 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" 
tools:context=".MainActivity" > 

<SurfaceView 
    android:id="@+id/surfaceView1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_alignParentLeft="true" /> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:text="@string/add_entries" /> 

<Button 
    android:id="@+id/button2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_below="@+id/button1" 
    android:text="@string/remove_entries" /> 

</RelativeLayout> 

我得到的錯誤是:在您的幫助

02-08 11:44:17.885: E/AndroidRuntime(10523): java.lang.RuntimeException: Unable 
to start activity ComponentInfo{com.example.mylistviewidea/com.example.mylistviewidea.MainActivity}: 
java.lang.ClassCastException: android.view.SurfaceView cannot be cast to 
com.example.mylistviewidea.MyListView 

謝謝!

乾杯,

邁克

回答

5

您應該有一個自定義視圖並在xml中使用它。

首先創建這個觀點

class MyListView extends SurfaceView implements Runnable { 
    SurfaceHolder myHolder; 
    Thread myThread = null; 
    boolean isRunning = true; 
    // My Variables 
    long dT; 
    int myRed; 

    public MyListView(Context context) { 
     super(context); 
     init(); 
    } 

    public MyListView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public MyListView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    private void init() { 
     myHolder = getHolder(); 
     myHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     while (isRunning) { 

      if (!myHolder.getSurface().isValid()) 
       continue; 
      Canvas canvas = myHolder.lockCanvas(); 
      canvas.drawARGB(128, 128, 0, 0); 
      dT = SystemClock.uptimeMillis(); 
      myRed = (int) ((int) 128 * (1 + Math.sin((double) dT/1000))); 
      myHolder.unlockCanvasAndPost(canvas); 

     } 
    } 
} 

你的XML改變這種

<RelativeLayout 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" 
tools:context=".MainActivity" > 

<com.example.testant.MyListView 
    android:id="@+id/surfaceView1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_alignParentLeft="true" /> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:text="add_entries" /> 

<Button 
    android:id="@+id/button2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_below="@+id/button1" 
    android:text="remove_entries" /> 

,改變主要活動

public class MainActivity extends Activity { 

    MyListView myListView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     myListView = (MyListView) findViewById(R.id.surfaceView1); 
     new Thread(myListView).start(); 

    } 
} 

注意,也有一個bug鎖定畫布,但這應該很好。

+0

太棒了!謝謝您的幫助!這個位myHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);'給了我deprication警告,但它的工作,讓我現在繼續前進!謝謝! – user1766513 2013-02-13 15:29:44

+1

@kaya你可能打算寫「canvas.drawARGB(128,myRed,0,0);」 – Calaf 2013-08-14 16:23:50

0

這可能是有點微不足道。但嘗試清理項目,然後重建。 OR 在一個單獨的java類文件中聲明一個MyListView,並將其引用到您的xml佈局文件中