Премини към съдържанието
Радослав Матев

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 също няма информация като започна да "слайдвам" на снимката.

 

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


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

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

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

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

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

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

Вход

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

Вход


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

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

    • от 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); } } Пробвах много неща но грешка и грешка :/ 
      Благодаря за времето което ще отделите
    • от Стефан Кънев
      Тъй като от скоро уча, Java ми е малко по-трудно, имам следната задача, но не мога да стигна до нейното написване: 
      Да се напише Java конзолно приложение със следната функционалност, създаване и спиране на 2 нишки, които използват споделен ресурс(променлива тип long). Нишка 1 интеrпетира и визуализира стойността по променливата, а нишка 2 декрементира и извежда по стойността на променливата.
      Ако някой може да ми помогне, ще съм благодарен, лек ден ! 
    • от DangerFTW
      Здравейте искам да попитам дали тази книга  цък ще ми помогне с програмирането на minecraft plugins . Ако няма да може да ми помогне , ще ви помоля да ми дадете линк към накаква книга за програмиране на minecraft плъгини (за предпочитане на български)
  • Разглеждащи в момента   0 потребители

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

  • Дарение

×

Информация

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