2010-05-09 6 views
7

J'ai roulé ma propre vue personnalisée et je peux dessiner à l'écran, mais ce que j'aimerais vraiment faire, c'est de régler le heightHigh de l'écran à, disons, 1000px et laisser le l'utilisateur fait défiler l'axe Y, mais j'ai des problèmes pour le faire. Quelqu'un peut-il aider?Android: créer une vue personnalisée défilable

Voici quelques code:

public class TestScreen extends Activity { 
    CustomDrawableView mCustomDrawableView; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     mCustomDrawableView = new CustomDrawableView(this); 
     setContentView(mCustomDrawableView); 
    } 
} 

et

public class CustomDrawableView extends View { 

    public CustomDrawableView(Context context) { 
     super(context); 
     setVerticalScrollBarEnabled(true); 
     setMinimumHeight(1000); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawLine(...); 
     // more drawing 
    } 
} 

J'ai essayé de passer outre scrollTo, scrollBy, awakenScrollBars etc avec un appel à super mais en vain. Ai-je manqué quelque chose de stupide, ou est-ce que je fais une erreur fondamentale?

Nous vous remercions à l'avance,

Martyn

Addition:

J'ai essayé d'ajouter cela comme un composant personnalisé avec le fichier de mise en page ci-dessous et modifié le code TestScreen pour pointer à la corrigez la ressource avec setContentView(R.layout.exampleLayout), mais cela provoque le blocage de l'émulateur. J'ai essayé de commenter le code vers le bas au strict minimum et il se brise encore, donc il y a quelque chose de fondamentalement mauvais que je fais, mais je ne suis pas sûr de ce qu'il est:

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
     <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent"> 
      <com.martyn.testApp.CustomDrawableView 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
      /> 
     </ScrollView> 
</LinearLayout> 

Répondre

15

Il suffit de mettre votre point de vue dans un ScrollView!

Notez que le ScrollWiew doit être le nœud racine (ici c'est votre LinearLayout)

+0

C'est la méthode que j'ai prise par la suite. J'ai un LinearLayout comme noeud de base dans la mise en page xml, puis un Scrollview avec ma vue personnalisée contenue dans – Martyn

+1

@Moons J'ai une disposition linéaire dans ma vue de défilement mais quand j'ajoute une vue d'image elle apparaît dans le rouleau mais quand je j'y ajoute ma vue personnalisée, ça ne marche pas ... mais ça montre quand je définis ma vue comme la vue du contenu de mon activité ça montre juste ma vue ... alors ça marche ... alors pourquoi ça ne marche pas dans une vue de défilement? – rahul

6

Si vous manquez toute l'activité d'un ScrollView, faire quelque chose comme ceci:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/android:list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 

    <LinearLayout android:id="@+id/scrollBody" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView android:id="@+id/textView1" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/string1" /> 

    <TextView android:id="@+id/textView1" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/string2" /> 

    </LinearLayout> 

</ScrollView> 

Ensuite, l'activité qui utilise cette mise en page peut ressembler à ceci:

public class ScrollingActivity extends Activity 
{ 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     this.setContentView(R.layout.scroll_layout); 
    } 
} 

cela suppose que le nom de votre fichier xml est scroll_layout.xml.

2

Si vous souhaitez faire défiler vous-même, vous pouvez utiliser un Scroller et un VelocityTracker tout en remplaçant la méthode onTouchEvent de votre vue personnalisée. Pour vous aider à l'implémenter, je vous recommande de regarder à travers les Javadocs de ces classes et de jeter un oeil aux implémentations de widgets android qui font défiler comme le NumberPicker.

Questions connexes