Премини към съдържанието
Raze

Android проблем с onFling GestureDetector.SimpleOnGestureListener

Препоръчан отговор


Здравейте

Мъча се с един пример от книга за програмиране на Android - Android 5 Programming
by Example
. Проблема е, че едни картинки трябва да се сменят като се плъзга наляво-надясно, но това при мен изобщо не се получава, а правя всичко както е в книгата, всичко друго работи без това. Къде може да е проблема?

DetailActivity:

package com.example.rado.ancientbritain;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.GestureDetector;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Random;

public class DetailActivity extends AppCompatActivity {
    private ImageView detailImage;
    private ArrayList<MainDataDef> detailData;
    private static final int MIN_DISTANCE = 150;
    private static final int OFF_PATH = 100;
    private static final int VELOCITY_THRESHOLD = 75;
    private GestureDetector detector;
    View.OnTouchListener listener;
    private int ImageIndex;
    private static final String DEBUG_TAG = "tag";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        ImageView detailWebLink = (ImageView) findViewById(R.id.detail_web_link);

        detailImage = (ImageView) findViewById(R.id.detail_image);
        detailImage.setOnTouchListener(listener);

        TextView detailName = (TextView) findViewById(R.id.detail_name);
        TextView detailDistance = (TextView) findViewById(R.id.detail_distance);
        TextView detailText = (TextView) findViewById(R.id.detail_text);
        detailText.setMovementMethod (new ScrollingMovementMethod());

        int i = MainActivity.currentItem;
        Random n = new Random();
        int m = n.nextInt((600 - 20) + 1) + 20;
        setTitle(getString(R.string.app_name) + " - " + MainData.
                nameArray[i]);
        detailImage.setImageResource(MainData.detailImageArray[i]);
        detailName.setText(MainData.nameArray[i]);
        detailDistance.setText(String.valueOf(m) + " miles");
        detailText.setText(MainData.detailTextArray[i]);

        detailWebLink.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.addCategory(Intent.CATEGORY_BROWSABLE);
                intent.setData(Uri.parse(MainData.detailWebLink[MainActivity.currentItem]));
                startActivity(intent);
            }
        });

        listener = new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return detector.onTouchEvent(event);
            }
        };

        ImageIndex = 0;

        class GalleryGestureDetector extends GestureDetector.SimpleOnGestureListener {
            private int item;
            {
                item = MainActivity.currentItem;
            }

            @Override
            public boolean onDown(MotionEvent e) {
                Log.d(DEBUG_TAG, "onDown");
                return true;
            }

            @Override
            public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float ve1ocityY) {
                Log.d(DEBUG_TAG, "left");
                Log.d(DEBUG_TAG, "right");
                if (Math.abs(event1.getY() - event2.getY()) > OFF_PATH)
                    return false;

                if (MainData.galleryArray[item].length != 0) {
                    // Swipe left
                    if (event1.getX() - event2.getX() > MIN_DISTANCE && Math.abs(velocityX) > VELOCITY_THRESHOLD) {
                        ImageIndex++;
                        if (ImageIndex == MainData.galleryArray[item].length) ImageIndex = 0;
                        detailImage.setImageResource(MainData.galleryArray[item][ImageIndex]);
                    } else {
                        // Swipe right
                        if (event2.getX() - event1.getX() > MIN_DISTANCE && Math.abs(velocityX) > VELOCITY_THRESHOLD) {
                            ImageIndex--;
                            if (ImageIndex < 0) ImageIndex = MainData.galleryArray[item].length - 1;
                            detailImage.setImageResource(MainData.galleryArray[item][ImageIndex]);
                        }
                    }
                }

                detailImage.setElevation(0);
                return true;
            }
        }

        detector = new GestureDetector(this, new GalleryGestureDetector());


        //detector.setIsLongpressEnabled(false);
    }

}

MainActivity:

package com.example.rado.ancientbritain;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    public static int currentItem;
    static View.OnClickListener mainOnClickListener;

    private class MainOnClickListener implements View.OnClickListener {
        private final Context context;

        private MainOnClickListener(Context c) {
            this.context = c;
        }

        @Override
        public void onClick(View v) {
            currentItem = recyclerView.getChildAdapterPosition(v);
            startActivity(new Intent(getApplicationContext(),
                    DetailActivity.class));
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.main_recycler_view);
        recyclerView.setHasFixedSize(true);
        mainOnClickListener = new MainOnClickListener(this);

        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        ArrayList<MainDataDef> mainData = new ArrayList<MainDataDef>();
        for (int i = 0; i < MainData.nameArray.length; i++) {
            mainData.add(new MainDataDef(
                    MainData.imageArray[i],
                    MainData.nameArray[i],
                    MainData.infoArray[i]
            ));
        }

        RecyclerView.Adapter adapter = new MainAdapter(mainData);
        recyclerView.setAdapter(adapter);
    }
}

MainAdapter:

package com.example.rado.ancientbritain;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by Rado on 7.9.2017 г..
 */

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> {
    private ArrayList<MainDataDef> mainData;

    public MainAdapter(ArrayList<MainDataDef> a) {
        this.mainData = a;
    }

    @Override
    public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.card_main, parent, false);
        v.setOnClickListener(MainActivity.mainOnClickListener);

        return new MainViewHolder(v);
    }

    @Override
    public void onBindViewHolder(final MainViewHolder holder, final int position) {
        ImageView imageIcon = holder.imageIcon;
        TextView textName = holder.textName;
        TextView textInfo = holder.textInfo;

        imageIcon.setImageResource(mainData.get(position).getImage());
        textName.setText(mainData.get(position).getName());
        textInfo.setText(mainData.get(position).getInfo());
    }

    @Override
    public int getItemCount() {
        return mainData.size();
    }

    public static class MainViewHolder extends RecyclerView.ViewHolder {
        ImageView imageIcon;
        TextView textName;
        TextView textInfo;

        public MainViewHolder(View v) {
            super(v);
            this.imageIcon = (ImageView) v.findViewById(R.id.card_image);
            this.textName = (TextView) v.findViewById(R.id.card_name);
            this.textInfo = (TextView) v.findViewById(R.id.card_info);
        }
    }

}

MainData:

package com.example.rado.ancientbritain;

/**
 * Created by Rado on 7.9.2017 г..
 */

public class MainData {
    static Integer[] imageArray = {R.drawable.henge_icon, R.drawable.horse_icon, R.drawable.wall_icon,
    R.drawable.skara_brae_icon, R.drawable.tower_icon};
    static Integer[] hengeArray = {R.drawable.henge_large, R.drawable.henge_2, R.drawable.henge_3,
                                    R.drawable.henge_4};
    static Integer[] horseArray = {};
    static Integer[] wallArray = {R.drawable.wall_large, R.drawable.wall_2};
    static Integer[] skaraArray = {};
    static Integer[] towerArray = {};
    static Integer[][] galleryArray = {hengeArray, horseArray, wallArray, skaraArray, towerArray};

    static String[] nameArray = {"Stonehenge",
    "Uffington White Horse", "Hadrian's wall",
    "Skara Brae", "Tower of London"};

    static String[] infoArray = {"Aylsbury, Wiltshire",
            "Uffington, Oxfordshire", "Cumbria - Durham",
            "Mainland, Orkney", "Tower Hamlets, London"};
    static Integer[] detailImageArray =
            {R.drawable.henge_large, R.drawable.horse_large,
                    R.drawable.wall_large, R.drawable.skara_brae_large,
                    R.drawable.tower_large};
    static Integer[] detailTextArray =
            {R.string.detail_text_henge,
                    R.string.detail_text_horse, R.string.detail_text_wall,
                    R.string.detail_text_skara,
                    R.string.detail_text_tower};
    static String[] detailWebLink =
            {"https://en.wikipedia.org/wiki/Stonehenge",
                    "https://en.wikipedia.org/wiki/Uffington_White_Horse",
                    "https://en.wikipedia.org/wiki/Hadrian%27s_Wall",
                    "https://en.wikipedia.org/wiki/Skara_Brae",
                    "https://en.wikipedia.org/wiki/Tower_of_London"};
}

ActivityDetail:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/detail_image"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_gravity="center_horizontal"
        android:layout_weight="3"
        app:srcCompat="@drawable/wall_large" />

    <TextView
        android:id="@+id/detail_name"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Name" />

    <TextView
        android:id="@+id/detail_distance"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Distance" />

    <TextView
        android:id="@+id/detail_text"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:gravity="center"
        android:layout_weight="2"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:maxLines = "100"
        android:scrollbars = "vertical"
        android:text="Text" />

    <ImageView
        android:id="@+id/detail_web_link"
        android:layout_width="64dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_gravity="right"
        android:gravity="right"
        app:srcCompat="@drawable/web_icon" />

</LinearLayout>

ActivityMain

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    tools:context="com.example.rado.ancientbritain.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/main_recycler_view"
        android:layout_width="368dp"
        android:layout_height="495dp"
        card_view:contentPadding="0dp"
        card_view:cardMaxElevation="1dp"
        card_view:cardElevation="1dp"


        card_view:cardUseCompatPadding="false"
        tools:ignore="MissingConstraints"
        tools:layout_editor_absoluteY="8dp"
        tools:layout_editor_absoluteX="8dp" /> />

</android.support.constraint.ConstraintLayout>

CardMain

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/card_image"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="2"
                android:contentDescription=""
                app:srcCompat="@mipmap/ic_launcher" />

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="4.19"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/card_name"
                    android:layout_width="236dp"
                    android:layout_height="36dp"
                    android:text="card_name"
                    android:textAppearance="?android:attr/textAppearanceLarge" />

                <TextView
                    android:id="@+id/card_info"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="card_info"
                    android:textAppearance="?android:attr/textAppearanceSmall" />

            </LinearLayout>

        </LinearLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>

Ако някой може да помага, още не съм толкова навътре в Андроид и не мога да разбера защо не работи. В debug всичко ми излиза нормално, но като стигне до класа за "слайдването" го минава само и нищо не излиза, в Android Monitor също няма информация като започна да "слайдвам" на снимката.

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

  • Разглеждащи това в момента   0 потребители

    Няма регистрирани потребители разглеждащи тази страница.

  • Подобни теми

    • от Kristian Krastev
      Здравейте,
      искам да попитам ако имам това:
      JLabel time = new JLabel();
      JLabel time1 = new JLabel();
              Thread clock = new Thread() {
                  public void run() {
                      for (;;) {
                      Date date = new Date();
                      SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
                      
                      time.setText(format.format(date));
                      time1.setText(format.format(date));
                      try {
                          sleep(1000);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                  }
              }
          };
          clock.start();
       
      как да направя на time и time1 int едното минус другото, за да ми даде разликата примерно ако time е 14:00 а time1 е 14:01 
      да ми изведе времетраене 00:01 една минута.
       
      time ще е когато се натисне един бутон а time1 когато се натисне друг бутон,и
      целта е да даде разликата в времето на натискането на бутоните.
      Благодаря предварително!
    • от Kristian Krastev
      Здравейте,
      искам да попитам ако една JTextArea чете от три файла:
      файл "A" файл "B" и файл "C"
      Имали как JTextArea примерно като прочете реда от файл "A"  реда да бъде с червен цвят,
      реда от файл "B" да бъде със син цвят а реда от файл "C" да бъде с зелен цвят.
    • от Kristian Krastev
      ако int = 0;
      и после му зададеш да дава по едно число отгоре след натискане на бутон с i++;
      как мога да запазя последното дадено число от i след рестарт на програмата?
      Примерно i++; System.out.println(i); натиснал съм 50 пъти бутона и стигнало до 50 но след рестарт пак ще започне
      от 0.
      Въпроса ми е как да продължи от 50? 
    • от Магдаленаг
      Please guys if u have time to spare I'd be extremely and beyond greatful
      Да се разработи уеб сайт по тема музикални изпълнители. 
      Сайтът трябва да съдържа поне 4 страници, всяка от които да отговаря на:
      Задължително трябва да се предвиди версия за ниска разделителна способност на екрана (800 x 600 пиксела) и реализирана с CSS; за този случай може да се използва свободно избрана и 
      независима схема за разположение, като единственото изискване е за запазване на 
      използваемостта.
      Сайтът трябва да включва всички технологии - HTML/XHTML, 
      CSS, DOM, JavaScript.
      Всички страници трябва да се валидират по HTML5. Допустимо е да има минимален брой 
      грешки от валидацията.
      Сайтът трябва да бъде придружен от документация, която да включва:
      1. Заглавна страница.
      2. Задание с посочените варианти:
      /списък на елементите :
      1. Меню, съдържащо rollover бутони, реализирано чрез JavaScript. При посочване на бутон да 
      се променят неговите цвят на фона и цвят на текста. Използването на изображения за 
      бутоните е по желание на студента.
      3. Номериран списък с римски цифри и форматиран със CSS, така че всички нечетни редове 
      да бъдат в курсив (наклонени).
      4. Неномериран списък, използващ собствено изображение подредба на елементите по 
      хоризонтал (т.е. елементите да не са на нов ред).
      6. Формуляр, съдържащ текстови полета за въвеждане на собствено име, фамилно име, email, 
      голямо поле за съобщение, избор чрез радио бутони на приоритета на съобщението –
      „нисък”, „среден” или „висок” и два бутона – „Изпрати” и „Изчисти”. Чрез CSS на 
      текстовите полета и бутоните да се зададе цвят на фона и цвят на текста./
      3. Използваните HTML и CSS код, с които е реализирана зададената схема на 
      разположение:
                            header
                        навигация
                Осн                              За
      съдържание               контакти
      4. Използваният или собствен JavaScript код. 
      5. Резултати от валидацията на отделните страници.
      6. Списък на източниците, от където е заимстван готов код, текст или снимки.
    • от Frozen11
      Здравейте,
      Имам следната задача:
      Единственото, което успях да направо дотук е страницата за вход/регистрация с две взаимно изключващи се форми. При регистрация успях да направя създаването на XML файл, но всеки път се създава нов с името на потребителя, а ми трябва един. Ще се радвам някой да откликне. Благодаря.
  • Дарение

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.