2011-10-19 123 views
1

我有一個自定義視圖,我必須將它放在一個線性佈局中,並將layout_gravity = center。 這是自定義視圖:自定義視圖不以xml佈局爲中心android

public class GIFView extends View{   
    private Movie movie; 
private InputStream is; 
private long moviestart; 

public GIFView(Context context) { 
    super(context); 
    is=context.getResources().openRawResource(R.drawable.anim_cerca); 
    movie=Movie.decodeStream(is); 
} 
public GIFView(Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
    is=context.getResources().openRawResource(R.drawable.anim_cerca); 
    movie=Movie.decodeStream(is); 
} 

public GIFView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    is=context.getResources().openRawResource(R.drawable.anim_cerca); 
    movie=Movie.decodeStream(is); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    long now=android.os.SystemClock.uptimeMillis(); 
    Paint p = new Paint(); 
    p.setAntiAlias(true); 
    if (moviestart == 0) 
     moviestart = now; 

    int relTime = (int)((now - moviestart) % movie.duration()); 
    movie.setTime(relTime); 
    movie.draw(canvas,0,0); 
    this.invalidate(); 
}       
}  

這是我的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="@drawable/sfondo"> 
<LinearLayout android:id="@+id/linearLayout2" 
    android:layout_height="wrap_content" android:layout_width="match_parent" 
    android:orientation="vertical"> 
    <LinearLayout android:id="@+id/linearLayout1" 
     android:layout_height="fill_parent" android:weightSum="1" 
     android:layout_width="fill_parent" android:orientation="horizontal"> 
     <ImageView android:layout_height="wrap_content" android:id="@+id/imageView1" 
      android:src="@drawable/trovachiavi" android:layout_width="wrap_content" 
      android:layout_marginTop="10dp" android:layout_marginLeft="5dp"></ImageView> 
     <ImageButton android:id="@+id/infoButton" 
      android:background="@null" android:layout_height="47dp" 
      android:layout_marginLeft="5dip" android:layout_weight="0.25" 
      android:layout_marginTop="15dip" android:src="@drawable/info_mini" 
      android:layout_width="47dp"> 
     </ImageButton> 
    </LinearLayout> 
</LinearLayout> 
<ImageButton android:id="@+id/avvia_cerca" 
    android:background="@null" android:layout_gravity="center|bottom" 
    android:layout_height="wrap_content" android:layout_width="wrap_content" 
    android:layout_marginTop="10dp"></ImageButton> 
<LinearLayout android:id="@+id/layoutGIF" 
    android:layout_height="wrap_content" android:layout_width="wrap_content" 
    android:orientation="vertical"> 
    <spazio.digitale.com.GIFView android:id="@+id/gIFView1" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:layout_gravity="center"></spazio.digitale.com.GIFView> 
</LinearLayout> 
</LinearLayout> 

當我在Eclipse開放的圖形化工具來設計XML,它給我這個錯誤:

java.lang.NullPointerException 
at spazio.digitale.com.GIFView.onDraw(GIFView.java:43) 
at android.view.View.draw(View.java:6880) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
at android.view.View.draw(View.java:6883) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
at android.view.View.draw(View.java:6883) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
at android.view.View.draw(View.java:6883) 
at com.android.layoutlib.bridge.impl.RenderSessionImpl.render(RenderSessionImpl.java:466) 
at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:320) 
at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:325) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService.createRenderSession(RenderService.java:380) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1310) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.java:1075) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.activated(GraphicalEditorPart.java:901) 
at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.partActivated(LayoutEditor.java:416) 
at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.partBroughtToTop(LayoutEditor.java:425) 
at org.eclipse.ui.internal.PartListenerList$2.run(PartListenerList.java:87) 
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 
at org.eclipse.core.runtime.Platform.run(Platform.java:888) 
at org.eclipse.ui.internal.PartListenerList.fireEvent(PartListenerList.java:57) 
at org.eclipse.ui.internal.PartListenerList.firePartBroughtToTop(PartListenerList.java:85) 
at org.eclipse.ui.internal.PartService.firePartBroughtToTop(PartService.java:208) 
at org.eclipse.ui.internal.WorkbenchPagePartList.firePartBroughtToTop(WorkbenchPagePartList.java:76) 
at org.eclipse.ui.internal.WorkbenchPagePartList.fireActiveEditorChanged(WorkbenchPagePartList.java:52) 
at org.eclipse.ui.internal.PartList.setActiveEditor(PartList.java:162) 
at org.eclipse.ui.internal.WorkbenchPage.makeActiveEditor(WorkbenchPage.java:1281) 
at org.eclipse.ui.internal.WorkbenchPage.setActivePart(WorkbenchPage.java:3530) 
at org.eclipse.ui.internal.WorkbenchPage.requestActivation(WorkbenchPage.java:3077) 
at org.eclipse.ui.internal.PartPane.requestActivation(PartPane.java:279) 
at org.eclipse.ui.internal.EditorPane.requestActivation(EditorPane.java:98) 
at org.eclipse.ui.internal.PartPane.setFocus(PartPane.java:325) 
at org.eclipse.ui.internal.EditorPane.setFocus(EditorPane.java:127) 
at org.eclipse.ui.internal.PartStack.presentationSelectionChanged(PartStack.java:844) 
at org.eclipse.ui.internal.PartStack.access$1(PartStack.java:827) 
at org.eclipse.ui.internal.PartStack$1.selectPart(PartStack.java:137) 
at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation$1.handleEvent(TabbedStackPresentation.java:133) 
at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:269) 
at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:278) 
at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder.access$1(DefaultTabFolder.java:1) 
at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder$2.handleEvent(DefaultTabFolder.java:88) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:3783) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1375) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1398) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1383) 
at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1195) 
at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:2743) 
at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1429) 
at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:257) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:3783) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1375) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1398) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1383) 
at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1195) 
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3629) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3284) 
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640) 
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604) 
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438) 
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115) 
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:620) 
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:575) 
at org.eclipse.equinox.launcher.Main.run(Main.java:1408) 

如果我把自定義視圖放在其他元素的上面,在設備上運行它,這些元素將不會顯示。當xml在這裏完成時,我將所有其他元素放在自定義視圖上方,以便它們顯示,但自定義視圖不在佈局中居中。我能做什麼?

回答

1

你可以使用

<LinearLayout android:id="@+id/layoutGIF" 
    android:layout_height="wrap_content" android:layout_width="wrap_content" 
    android:orientation="vertical" android:weightSum="1"> 
    <spazio.digitale.com.GIFView android:id="@+id/gIFView1" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:layout_gravity="center" 
android:layout_weight="0.8"></spazio.digitale.com.GIFView> 
</LinearLayout> 

,但我建議你用Animation代替GIF