Изменить представление onClick coverflow – Android

Я использую этот CoverFlow: http://www.inter-fuser.com/2010/02/android-coverflow-widget-v2.html

Я хочу иметь возможность изменять вид, когда я нажимаю кнопку, причем кнопка представляет собой значок «назад / вперед», который приведет вас к предыдущему / следующему элементу в потоке покрытия.

Я немного изменил обложку, чтобы вместо этого использовать XML-макет.

Вот мой метод onCreate():

 setContentView(R.layout.main);

 CoverFlow coverFlow = (CoverFlow)findViewById(R.id.coverflow);  

 coverFlow.setAdapter(new ImageAdapter(this));
 ImageAdapter coverImageAdapter =  new ImageAdapter(this);     
 coverFlow.setAdapter(coverImageAdapter);
 coverFlow.setSpacing(-20);
 coverFlow.setSelection(0, true);
 coverFlow.setAnimationDuration(1000);

 tv = (TextView)findViewById(R.id.textView1);

 coverFlow.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        Toast.makeText(getBaseContext(), String.valueOf(arg2), Toast.LENGTH_SHORT).show();
    }
 });

 coverFlow.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        tv.setText(String.valueOf(arg2));
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // Do something
    }
 });

Мой XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/home_background"
    android:orientation="vertical" >

    <com.demo.app.coverflow.CoverFlow
        android:id="@+id/coverflow"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_marginBottom="39dp"
        android:layout_marginLeft="35dp"
        android:background="@drawable/button_left" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="39dp"
        android:layout_marginRight="35dp"
        android:background="@drawable/button_right" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="55dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="hello"
        android:textColor="@color/White"
        android:textSize="16dp" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginRight="170dp"
        android:layout_marginTop="15dp"
        android:src="@drawable/unsa_logo" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="14dp"
        android:layout_marginTop="23dp"
        android:src="@drawable/pnc_logo" />

</RelativeLayout>

person Mike Bryant    schedule 06.11.2012    source источник
comment
дайте мне знать, если мой ответ не имеет смысла   -  person David T.    schedule 16.11.2012
comment
эй, чувак, большое спасибо за твой ответ, я студент, приложение - это приложение, которое я разрабатываю для компании, в которой я работаю, однако на этой неделе и на следующей неделе я универ (курс это 2 недели в компании / 2 недели в университете и т. д.), поэтому у меня еще не было возможности проверить ваш ответ, но он выглядит очень многообещающе :)   -  person Mike Bryant    schedule 16.11.2012
comment
ха-ха. Попался. извините, я не хотел спешить. это был вопрос о награде, поэтому мне было просто любопытно. удачи!!   -  person David T.    schedule 16.11.2012
comment
возможно ли дать вам награду на следующей неделе или есть предел? чтобы дать мне время, чтобы проверить это в первую очередь   -  person Mike Bryant    schedule 16.11.2012
comment
эй, Майк, спасибо за внимание, это действительно здорово с твоей стороны :) но не волнуйся. да, плюса достаточно. принимайте только после того, как вы попробовали, и это работает, и я ответил на ВСЕ ваши вопросы. потому что иначе другие люди будут думать, что я дал правильный ответ, когда, возможно, я что-то упустил. или иногда я не буду читать комментарии к вопросу, который уже помечен как правильный. не беспокойтесь о бонусных баллах. давайте сначала поможем вам отладить ваш код и убедиться, что мой ответ правильный, для вас, а также для других в переполнении стека. вот для чего нужно переполнение стека.   -  person David T.    schedule 17.11.2012


Ответы (3)


Спасибо, Дэвид, я один из коллег Майка, но я никогда не писал ни строчки на Java. Я работаю в iOS отделе нашей компании. Я понял, о чем вы говорили. Ваш ответ был полезен и хорошо написан!

Я просто должен был добавить:

if ( currentimageposition < coverFlow.getcount()-1) {
     coverFlow.setSelection(currentImagePosition +1, true);
     currentImagePosition = currentImagePosition +1;
}

Поскольку ваш onItemSelected не был вызван (обновите текущий маркер), я не знаю, почему.

Однако coverFlow.selection( int , bool) не анимируется. Это просто установленный метод при загрузке представления. Например, coverFlow.selection(3,true) установит четвертое изображение в центре обложки.

person Defoncesko    schedule 20.11.2012

Пока я пытался выяснить, как добавить анимацию, я наткнулся на это, которое делает все в одну строку:

идите налево

coverFlow.onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, new KeyEvent(0, 0));

Иди направо

coverFlow.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, new KeyEvent(0, 0));

(просто добавьте каждую строку в соответствующие методы onclick кнопки

Надеюсь, это может помочь любому, кто окажется в той же ситуации, что и я :)

person Mike Bryant    schedule 26.11.2012
comment
onKeyDown, как я могу распечатать тост. что нужно изменить в приведенном выше коде? - person Mohsin; 06.03.2015

Надеюсь, я понимаю ваш вопрос. если да, то вот идея:

вам нужно сохранить переменную частного экземпляра, которая отслеживает текущую позицию изображения, отображаемого из потока покрытия. затем вы обновляете его из метода setOnItemSelectedListener(), унаследованного от Gallery. На кнопку «назад» или «вперед» вы просто устанавливаете текущий выбор +/- 1 в зависимости от нажатой кнопки.

поэтому в своей деятельности добавьте переменную экземпляра int, которая будет отслеживать позицию, например...

public class MyActivity {
    private int currentImagePosition = -1;

    //add the rest of your onCreate code here...
}

Затем вам нужно иметь возможность обновлять текущую позицию изображения, которое в данный момент отображается в потоке покрытия. вы можете сделать это, переопределив setOnItemSelectedListener так (внутри вашего метода onCreate):

coverFlow.setOnItemSelectedListener(new OnItemSelectedListener(){
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                currentImagePosition = position; //this will update your current marker
            }
};

Наконец, все, что вам нужно сделать, это настроить прослушиватели нажатия каждой кнопки на переход к предыдущему или следующему изображению с помощью setSelection( currentImagePosition+1 ) или setSelection( currentImagePosition-1 ). Кстати, что делает истинный или ложный параметр setSelection()? я не уверен, что он делает, поэтому я просто буду использовать true, как вы изначально. ваш метод onCreate() теперь будет выглядеть примерно так:

@Override
public void onCreate(Bundle savedInstanceState){
    //insert your other code in onCreate here in this spot.... 

    //add the following lines to your code:
    Button goLeft = (Button) findViewById(R.id.button1);
    goLeft.setOnClickListener( new OnClickListener() {
        @Override
        public void onClick(View v) {
                //go to previous image
                        if( currentImagePosition > 0 ){ //i'm assuming you dont want to go left anymore once at the leftmost image
                             coverFlow.setSelection(currentImagePosition - 1, true);
                        }
        }
    } ) ;


    Button goRight = (Button) findViewById(R.id.button2);
    goRight.setOnClickListener( new OnClickListener() {
        @Override
        public void onClick(View v) {
                //go to previous image
                        if( currentImagePosition < coverFlow.getCount()-1 ){ //i'm assuming you dont want to go left anymore once at the leftmost image
                             coverFlow.setSelection(currentImagePosition + 1, true);
                        }
        }
    } ) ;


}

ПРИМЕЧАНИЕ. Предполагается, что часть об обновлении позиции работает при чтении Получить положение текущего изображения, отображаемого в галерее, поэтому я надеюсь, что это сработает. если нет, то я хотя бы пытался :D

Удачи!!!

person David T.    schedule 09.11.2012
comment
Не могли бы вы сказать мне, как только я нажму на любую позицию, тогда только это изображение должно быть видно в центре экрана, а остальные изображения в обложке должны быть скрыты ....... как это сделать? тогда, когда я прокручиваю влево или вправо в центр элемента, все элементы должны быть видны? - person Erum; 21.05.2015
comment
@Erum Я думаю, что в представлениях Android есть способ сделать что-то вроде setVisibility, поэтому я бы использовал это, чтобы скрыть представления. Но я думаю, что конкретная вещь, которую вы хотели сделать, может быть немного сложнее. может быть, вам следует задать здесь новый вопрос о переполнении стека, и тогда другие люди (может быть, и меня тоже) смогут посмотреть? - person David T.; 21.05.2015
comment
Пожалуйста, проверьте, мне нужен такой результат dailymotion.com/video/x2qx2if - person Erum; 21.05.2015
comment
@Erum Да, я думаю, чтобы добиться этого эффекта, вам нужно сделать так, чтобы, когда значок получает onClick, вы должны установить видимость всех представлений значка на View.INVISIBLE. и после обнаружения пролистывания влево и вправо просмотрите все значки и сделайте их View.VISIBLE. но вы действительно должны задать это как новый вопрос здесь, в StackOverflow, чтобы больше людей могли дать вам подробную информацию. - person David T.; 26.05.2015
comment
еще кое-что, мне не удалось провести пальцем влево, как только я нахожусь в 0-м индексе, почему ?? можно ли установить пролистывание влево, не имеет значения, по какому индексу мы находимся @David T. как я могу добиться этого, вы можете прийти сюда chat.stackoverflow.com/rooms/78662/fancycoverflow - person Erum; 26.05.2015