Wie verwendet man ein ViewSwitcher?

FlipperActivity.java
Code:
package de.android_hilfe.benotto.viewflipper;

import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.View.OnTouchListener;
import android.widget.ViewFlipper;

public class FlipperActivity extends Activity {

	ViewFlipper mFlipper;
	GestureDetector mGestureDetector;
	
	private class MyOnGestureListener extends SimpleOnGestureListener {
		@Override
		public void onLongPress(MotionEvent e) {
			mFlipper.showNext();
		}
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.scroll);
		
		mGestureDetector = new GestureDetector(this, new MyOnGestureListener());
		
		mFlipper = (ViewFlipper) findViewById(R.id.flipper);
		mFlipper.setOnTouchListener(
			new OnTouchListener() {
				@Override
				public boolean onTouch(View v, MotionEvent event) {
					boolean handled = mGestureDetector.onTouchEvent(event);
					return handled;
				}
			}
		);
	}
}

scroll.xml
HTML:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<LinearLayout
  		android:orientation="vertical"
  		android:layout_width="fill_parent"
  		android:layout_height="wrap_content">
  		<ViewFlipper
  			android:id="@+id/flipper"
		  	android:layout_width="fill_parent"
		  	android:layout_height="200dip">
  		  	<TextView
		 		android:layout_width="wrap_content"
		  		android:layout_height="wrap_content"
		  		android:text="ABC" />
		  	<TextView
		  		android:layout_width="wrap_content"
		  		android:layout_height="wrap_content"
		  		android:text="DEF" />
		</ViewFlipper> 
	</LinearLayout>
</ScrollView>

PS: So Java Syntaxhighlighting für's Forum wäre schon cool!
 
  • Danke
Reaktionen: pyretta
Cool, mit deinem Code geht es. Ich hatte keinen GestureDetector verwendet sondern folgendes um das sliden noch etwas zu animieren:

Activity:
Code:
public boolean onTouchEvent(MotionEvent touchevent) {
        switch (touchevent.getAction())
        {
            case MotionEvent.ACTION_DOWN:
            {
                oldTouchValue = touchevent.getX();
                break;
            }
            case MotionEvent.ACTION_UP:
            {
                float currentX = touchevent.getX();
                if (oldTouchValue < currentX)
                {
                    vf.setInAnimation(AnimationHelper.inFromLeftAnimation());
                    vf.setOutAnimation(AnimationHelper.outToRightAnimation());
                    vf.showNext();
                }
                if (oldTouchValue > currentX)
                {
                    vf.setInAnimation(AnimationHelper.inFromRightAnimation());
                    vf.setOutAnimation(AnimationHelper.outToLeftAnimation());
                    vf.showPrevious();
                }
            break;
            }
        }
        return false;
    }
AnimationHelper.java

Code:
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;

public class AnimationHelper {
    public static Animation inFromRightAnimation() {

        Animation inFromRight = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT,  +1.0f, Animation.RELATIVE_TO_PARENT,  0.0f,
        Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,   0.0f
        );
        inFromRight.setDuration(350);
        inFromRight.setInterpolator(new AccelerateInterpolator());
        return inFromRight;
        }
    public static Animation outToLeftAnimation() {
        Animation outtoLeft = new TranslateAnimation(
         Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,  -1.0f,
         Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,   0.0f
        );
        outtoLeft.setDuration(350);
        outtoLeft.setInterpolator(new AccelerateInterpolator());
        return outtoLeft;
        }    
    // for the next movement
    public static Animation inFromLeftAnimation() {
        Animation inFromLeft = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT,  -1.0f, Animation.RELATIVE_TO_PARENT,  0.0f,
        Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,   0.0f
        );
        inFromLeft.setDuration(350);
        inFromLeft.setInterpolator(new AccelerateInterpolator());
        return inFromLeft;
        }
    public static Animation outToRightAnimation() {
        Animation outtoRight = new TranslateAnimation(
         Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,  +1.0f,
         Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,   0.0f
        );
        outtoRight.setDuration(350);
        outtoRight.setInterpolator(new AccelerateInterpolator());
        return outtoRight;
        }
}

Wie verbinde ich das ganze jetzt mit deinem Code um das Sliden zu animieren?
 
Zwecks der Animation kann wohl keiner weiterhelfen?
Hab noch eine andere Frage. Hab ja jetzt in dem ViewFlipper mehrere TableLayouts (pro View ein TableLayout). Wie kann ich denn dem ViewFlipper sagen, das eine ganz bestimmte View angezeigt werden soll mit der ID xy des TableLayouts?
 
Hallo,

ich möchte auch einen ViewFlipper in meine App einbauen, der mittels Gestensteuerung die Views ändert.

Erstmal vielen Dank an BenOtto, Dein Code hat auch mir sehr geholfen und mich auch schon fast an die Lösung meines Problems gebracht, aber leider eben nur fast.

Mein Problem:
Ich möchte zwischen 2 ImageViews switchen die jeweils mit einem ClickListener einen Intent aufrufen sollen.

In dem Code von BenOtto wird ja der "onLongPress" Event abgefangen. Wenn der User nun "long presst" auf eines der Bilder wird nicht etwa das nächste Bild angezeigt, sondern der Intent aufgerufen (eigentlich auch logisch).

Jetzt hatte ich mir in meinem jugendlichen Leichtsinn gedacht, ok, fangen wir doch einfach statt dem onLongPress-Event den "onFling"-Event ab.

Hmm.. nunja.. dann sah man dass man nichts sah... Der Event wird quasi ignoriert.

Hier mal mein Code:
Code:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ViewFlipper;

public class FlipperActivity extends Activity implements OnClickListener{

    ViewFlipper mFlipper;
    GestureDetector mGestureDetector;

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    
    private class MyOnGestureListener extends SimpleOnGestureListener {
//        @Override
//        public void onLongPress(MotionEvent e) {
//            mFlipper.showNext();
//        }
        
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
                if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    mFlipper.showNext();
                }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    mFlipper.showPrevious();
                }
            } catch (Exception e) {
                // TODO Auto-generated method stub
            }
            return false;
        }

    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mGestureDetector = new GestureDetector(this, new MyOnGestureListener());
        
        mFlipper = (ViewFlipper) findViewById(R.id.flipper);
        mFlipper.setOnTouchListener(
            new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    boolean handled = mGestureDetector.onTouchEvent(event);
                    return handled;
                }
            }
        );
        
        ImageView bild_1 = (ImageView) findViewById(R.id.bild_1);
        bild_1.setOnClickListener(this);
        
        ImageView bild_2 = (ImageView) findViewById(R.id.bild_2);
        bild_2.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.bild_1:
            Intent bild_1 = new Intent(this, bild_1.class);
            startActivity(bild_1);
            finish();
            break;
        case R.id.bild_2:
            Intent bild_2 = new Intent(this, bild_2.class);
            startActivity(bild_2);
            finish();
            break;
        }
    }
}

Ist das denn überhaupt die richtige Denke um das Problem zu lösen?
Oder gibt es bessere Wege?
Und.. kann mir jemand helfen dass der "onFling" abgefangen wird?

Vielen Dank schon mal im Voraus.

pyretta
 
Keiner eine Idee zu dem "onFling"-Event?

Ich löse es jetzt eben mittelfristig mit Buttons unterhalb des ViewFlippers.

Aber rein interessehalber, wäre ich schon dankbar, wenn mir jemand das mit dem onFling erklären könnte.

Also meine "Quick and Dirty" Lösung:

Code:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ViewFlipper;

public class FlipperActivity extends Activity implements OnClickListener{

    ViewFlipper mFlipper;
    GestureDetector mGestureDetector;
    
    private class MyOnGestureListener extends SimpleOnGestureListener {
        @Override
        public void onLongPress(MotionEvent e) {
            mFlipper.showNext();
        }
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mGestureDetector = new GestureDetector(this, new MyOnGestureListener());
        
        mFlipper = (ViewFlipper) findViewById(R.id.flipper);
        mFlipper.setOnTouchListener(
            new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    boolean handled = mGestureDetector.onTouchEvent(event);
                    return handled;
                }
            }
        );
        
        Button buttonFlipNext = (Button)findViewById(R.id.flipnext);
        Button buttonFlipPrevious = (Button)findViewById(R.id.flipprevious);
        
        buttonFlipNext.setOnClickListener(new Button.OnClickListener(){
             
               @Override
               public void onClick(View arg0) {
             mFlipper.showNext();
               }});
                   
        buttonFlipPrevious.setOnClickListener(new Button.OnClickListener(){
             
               @Override
               public void onClick(View arg0) {
                mFlipper.showPrevious();
               }});
        
        ImageView bild_1 = (ImageView) findViewById(R.id.bild_1);
        bild_1.setOnClickListener(this);
        ImageView bild_2 = (ImageView) findViewById(R.id.bild_2);
        bild_2.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.bild_1:
            Intent bild_1 = new Intent(this, bild_1.class);
            startActivity(bild_1);
            finish();
            break;
        case R.id.bild_2:
            Intent bild_2 = new Intent(this, bild_2.class);
            startActivity(bild_2);
            finish();
            break;
        }
    }
}
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
10
Aufrufe
229
swa00
swa00
M
Antworten
3
Aufrufe
169
moin
M
S
Antworten
7
Aufrufe
1.163
swa00
swa00
Zurück
Oben Unten