'Ausziehbarer' view - Android

Hallo,

ich suche nach einer Möglichkeit einen View praktisch aus der ‘Decke’ zu ziehen.

Zur veranschaulichung was ich eigentlich meine habe ich mal ein paar schematische Bilder angehängt…

Ich bin mir relativ sicher das es so etwas bereits in der API gibt, weil es so häufig sein müsste und auch ist.

Danke für eure Hilfe

(Wenn ihr nur ideen habt was man googlen könnte wäre es auch sehr nett die zu posten! Mir ist nämlich echt nichts eingefallen nach was ich da googlen könnte…)

Ich denke nicht dass du was finden wirst, weil da oben ist ja schon eine View und mit der müsstest du konkurrieren und ich denke, sie wird immer gewinnen :wink:
Ansonsten muss du das „einfach“ nur mitm GestureListener machen (ich hoffe das war der richtige Namen) und anhand von dem einfach die View rein fahren lassen

Ich hab mal ein bisschen rumgespielt. Soetwas kann man sich zur Not sehr gut selber bauen:

import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Touch;
import org.androidannotations.annotations.ViewById;

@EActivity(R.layout.forum_slider)
public class SliderActivity extends Activity {

    @ViewById(R.id.slider)
    LinearLayout linearLayout;

    float deltaY = 0;
    float totalHeight = 0f;

    @AfterViews
    void onAfterViews() {
        totalHeight = getResources().getDisplayMetrics().heightPixels;
    }

    @Click(R.id.button)
    public void showSlider() {
        linearLayout.animate().alpha(1f).y(0);
    }

    @Click(R.id.button2)
    public void hideSlider() {
        linearLayout.animate().alpha(0f).y(totalHeight);
    }

    @Touch(R.id.slider)
    void onTouch(View view, MotionEvent motionEvent) {

        if(motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
            deltaY = motionEvent.getRawY();
        } else if(motionEvent.getAction() == MotionEvent.ACTION_UP) {
            if(view.getY() >  (totalHeight / 4)) {
                hideSlider();
            } else {
                showSlider();
            }
        } else {
            float dY = motionEvent.getRawY() - deltaY;

            if(dY < 0) {
                deltaY = motionEvent.getRawY();
            } else {
                view.setY(dY);

                float alpha = 1f - 1f / totalHeight * dY; // dY -> {0, totalHeight} => [0, 100]

                view.setAlpha(alpha);
            }
        }
    }
}

forum_slider.xml:
[xml]<?xml version="1.0" encoding="utf-8"?>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Button"
    android:id="@+id/button"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

<LinearLayout
    android:id="@+id/slider"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:padding="5dp"
    android:background="@android:color/white">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Small Text"
        android:id="@+id/textView" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button2" />
</LinearLayout>
[/xml]

zusätzliche Anmerkung:
Das ganze Ding ist Quick’n’dirty. Aus dem Beispiel könntest du dir aber jetzt ne eigene View zusammenbauen, welche das Verhalten implementiert. Also in deinem fertigen Code implementiert dann eine eigene View und nicht die Activity das Verhalten!

Was dich noch irritieren könnte: ich verwende hier androidannotations. Also eine kurze Erklärung, was es hier mit den Annotationen auf sich hat:
@EActivity(R.layout.forum_slider) ist vergleichbar mit:

     super.onCreate(bundle);
     setContentView(R.layout.forum_slider);
}

Die Methode die mit @AfterViews annotiert ist, wird nach der onCreate ausgeführt.

@Click sorgt dafür, dass die nachfolgende Methode als OnClickListener dem Element hinzugefügt wird, dessen Id als Parameter in der Annotation steht
@Touch ist ähnlich wie @Click, nur dass hier ein OnTouchListener dem Element hinzugefügt wird.

Solltest du kein androidannotations verwenden (wovon ich ausgehe, aber nicht beim programmieren dran gedacht habe^^), dann musst du das halt umschreiben. Schrei wenn du dabei Probleme haben solltest.

Ich bin mir nicht so ganz im klaren was genau du möchtest. Folgende Möglichkeiten kann ich mir vorstellen:

a) Du möchtest eine einzige Slide ziehen können die als Menü fungiert.
b) Du möchtest eine Liste von Views top/down navigierbar machen, wie z.B. die feedly-App.

Im Falle von a) steht dir das DrawerLayout zur Verfügung. Gibt’s schon ewig in der API und war so um 2009 sehr beliebt. Wurde 2012 als NavigationDrawer im horizontalen Stil neugeboren.

Im Falle von b) gibt’s da z.B. den Directional ViewPager.
@Tomate_Salat interessant, du hast das selber nach gebaut. Hast du dich da ein bisschen mehr damit herum gespielt oder das gerade ad-hoc rausgehauen?

Ad-Hoc: Hatte das Thema gelesen, Eagle’s Beitrag gesehen und hatte Lust bekommen das zu programmieren.

Sorry das ich erst so spät Danke sage!
→ Danke
@Tomate_Salat Hat geholfen :wink: