Премини към съдържанието
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 потребители

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

  • Горещи теми в момента

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

    • от Магдаленаг
      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 файл, но всеки път се създава нов с името на потребителя, а ми трябва един. Ще се радвам някой да откликне. Благодаря.
    • от HRONICK991
      Да се състави програма на Java за 5 делегати на националната конференция с данни:
      - име
      - ЕГН
      - дни за нощувка
      - име на хотела
      - цена на нощувката 
      И изпълнява от меню следните операции:
      • извежда всички въведени данни:
      • зарежда нов масив с данните на делегатите, които са заплатили суми по големи от 100 лв. и са от зададено населено място;
      • зарежда текстови файл с данни на делегатите мъже от дадено населено място.
    • от Tonny Petkova
      Напишете програма, която изписва на конзолата дали дадено положително число се дели на 3 или на 5 без остатък.
    • от Iliq Zlatanov
      Здравейте искам да попитам някои може ли да ми даде пример как да искарам Pc извън for loopa 
       
      for (L2PcInstance pc : L2World.getInstance().getPlayers()) { if (pc.isOnline() && ((pc.getClient() != null) && !pc.getClient().isDetached())) { Object[] rowData = new Object[] { pc.getAccountName(), pc.getId(), pc.getName(), pc.getLevel(), pc.getCurrentHp(), pc.getCurrentMp(), pc.getCurrentCp(), pc.getPvpKills(), pc.getPkKills(), pc.getBaseClass(), pc.getCreateDate() }; model.addRow(rowData); } } Пробвах много неща но грешка и грешка :/ 
      Благодаря за времето което ще отделите
  • Дарение

×

Информация

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