2011-01-03 16 views
15

Tak, śledziłem ten konkretny wątek (How to stop scrolling in a Gallery Widget?), ale nie mogę go uruchomić.Tworzenie niestandardowej galerii - przesłonięcie OnFling

Stworzyłem niestandardową klasę MyGallery rozszerzającą galerię. Dodałem kod w powyższym linku ... czy powinienem dodać <com.example.mygallery do pliku XML? Jeśli tak, to czy dodaję również import do pliku java, czy nie jest to potrzebne z powodu pliku XML? Jestem bardzo zdezorientowany.

Chcę po prostu zrobić galerię przesuwać jeden obraz na raz za rzut.

plik XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/carlot_background" 
    > 
<com.gallerytest.mygallery 
    android:id="@+id/thisgallery" 
    android:gravity="center" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 
</LinearLayout> 

mygallery.java:

package com.gallerytest; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.KeyEvent; 
import android.view.MotionEvent; 
import android.widget.Gallery; 

public class mygallery extends Gallery { 

    public mygallery(Context ctx, AttributeSet attrSet) { 
     super(ctx); 
     // TODO Auto-generated constructor stub 
    } 

    private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ 
      return e2.getX() > e1.getX(); 
     } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){ 
     int kEvent; 
     if(isScrollingLeft(e1, e2)){ //Check if scrolling left 
     kEvent = KeyEvent.KEYCODE_DPAD_LEFT; 
     } 
     else{ //Otherwise scrolling right 
     kEvent = KeyEvent.KEYCODE_DPAD_RIGHT; 
     } 
     onKeyDown(kEvent, null); 
     return true; 
    } 

} 

main.java: pakiet com.gallerytest;

import android.app.Activity; 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.Toast; 
import android.widget.AdapterView.OnItemClickListener; 

public class main extends Activity { 
    /** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mygallery gallery = (mygallery) findViewById(R.id.thisgallery); 

     gallery.setAdapter(new AddImgAdp(this)); 

     gallery.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView parent, View v, int position, long id) { 

       Toast.makeText(main.this, "Position=" + position, Toast.LENGTH_SHORT).show(); 
      } 

     }); 

    } 

    public class AddImgAdp extends BaseAdapter { 
     int GalItemBg; 
     private Context cont; 


     private Integer[] Imgid = { 
       R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4, R.drawable.image5}; 

     public AddImgAdp(Context c) { 
      cont = c; 
      TypedArray typArray = obtainStyledAttributes(R.styleable.Gallery1); 
      GalItemBg = typArray.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 0); 
      typArray.recycle(); 
     } 

     public int getCount() { 
      return Imgid.length; 
     } 

     public Object getItem(int position) { 
      return position; 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      ImageView imgView = new ImageView(cont); 

      imgView.setImageResource(Imgid[position]); 

      imgView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
      imgView.setBackgroundResource(0x0106000d); 
      imgView.setLayoutParams(new mygallery.LayoutParams(300, 240)); 

      return imgView; 
     } 
    } 
} 

Chciałbym pomóc. Dzięki!!

~ Rick

Odpowiedz

23

Wystarczy dodać param attrSet do konstruktora niestandardowego galerii:

super(ctx, attrSet); 

Ten pracował dla mnie. Leo Vannucci

+0

To działa! Dzięki wam. – user560837

+3

Być może mógłbyś zaakceptować to jako ostateczną odpowiedź? –

+0

pomógł mi też .......... dzięki – viv

3

Tak. Powinieneś po prostu użyć com.gallerytest.mygallery zamiast Galerii w XML-ach. Wszystko będzie dobrze, bo moja galeria jest podklasą galerii. Nie ma potrzeby importowania w formacie XML.

+0

Ok. Wtedy okazuje się, że mój kod setAdapter już nie działa poprawnie z powyższym kodem. Wszystko, co zrobiłem, to zmienić widok galerii na niestandardową galerię. Ktoś ma ochotę wypróbować kod i sprawdzić, czy potrafisz zidentyfikować problem? Prawdopodobnie przeoczyłem coś prostego. DZIĘKI! ... chociaż wydaje się, że pominąłem kod AddImgAdp ... znajduje się w powyższym linku. – user560837

1

Zmiana XML była kluczem ... Od pewnego czasu otrzymywałem TypeCastException i nie mogłem znaleźć przyczyny w moim kodzie. W końcu znalazłem w tym poście "Powinieneś po prostu użyć com.gallerytest.mygallery zamiast Gallery in XMLs" i rozwiązać mój problem. wielkie dzięki.

Powiązane problemy