草庐IT

Android ViewFlipper 不翻转

coder 2023-12-02 原文

我有一个 ViewFlipper,它应该对滑动手势使用react,但它没有。

Activity

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    listView = this.getListView();
    detector = new GestureDetector(this, new FlingGestureListener(listView));
    ...
}

FlingGestureListener

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    int pos = source.pointToPosition(Math.round(e1.getX()), Math.round(e1.getY()));
    View v = source.getChildAt(pos - source.getFirstVisiblePosition());
    System.out.println("fling: x=" + velocityX + " y=" + velocityY);
    try {
        IFlingable flingable = (IFlingable) v;
        if(velocityY > -200 && velocityY < 200) {
            if(velocityX < 0)
                flingable.fling(IFlingable.RIGHT_TO_LEFT);
            else if(velocityX > 0)
                flingable.fling(IFlingable.LEFT_TO_RIGHT);
        }
    } catch(Exception e) {}
    return false;
}

使用实现 IFlingable 的 ViewFlipper 查看

public void fling(int direction) {
    System.out.println("flip: " + direction);
    switch(direction) {
        case IFlingable.LEFT_TO_RIGHT:
            System.out.println("piep");
            GUIHelper.setAnimationSlideLeftToRight(context, switcher);
            switcher.showNext();
            break;
        case IFlingable.RIGHT_TO_LEFT:
            System.out.println("pup");
            GUIHelper.setAnimationSlideRightToLeft(context, switcher);
            switcher.showPrevious();
            break;
    }
}

布局

<ViewFlipper android:id="@+id/viewSwitcher"
    android:layout_height="wrap_content"
    android:layout_width="match_parent" android:layout_weight="1"     
    android:inAnimation="@anim/slide_in_left" 
    android:outAnimation="@anim/slide_out_right">
        <LinearLayout android:layout_height="wrap_content" 
           android:layout_width="match_parent" android:orientation="vertical">
             ...
        </LinearLayout>
      ...
    </ViewFlipper>

日志

fling: x=2542.3613 y=95.877945
flip: 0
piep

我收到了正确的日志消息,因此 ViewFlipper 上的 showNext() 得到执行,但它不会更改其在 gui 上的 View 。我错过了什么吗?我有另一种布局,它使用 ViewSwitcher 而不是 Flipper,并且可以工作。

编辑:

这里是缺少的类:

public class GUIHelper {
... 

public static void setAnimationSlideLeftToRight(Context context, ViewAnimator switcher) {
    Animation in = AnimationUtils.loadAnimation(context, R.anim.slide_in_left);
    Animation out = AnimationUtils.loadAnimation(context, R.anim.slide_out_right);
    switcher.setInAnimation(in);
    switcher.setOutAnimation(out);
}

public static void setAnimationSlideRightToLeft(Context context, ViewAnimator switcher) {
    Animation in = AnimationUtils.loadAnimation(context, R.anim.slide_in_right);
    Animation out = AnimationUtils.loadAnimation(context, R.anim.slide_out_left);
    switcher.setInAnimation(in);
    switcher.setOutAnimation(out);
}

...
}

public interface IFlingable {

    public static final int LEFT_TO_RIGHT = 0;
    public static final int RIGHT_TO_LEFT = 1;

    public void fling(int direction, boolean fling);

}

最佳答案

你好,这是在 listView 上运行的滑动代码,就像你的 xml 我已经在 ViewFlipper 中放置了一个带有父 LinearLayout 的 ListView

import android.app.Activity;
import android.os.Bundle;

import android.view.GestureDetector;

import android.view.GestureDetector.SimpleOnGestureListener;

import android.view.MotionEvent;

import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.ViewFlipper;

import android.widget.AdapterView.OnItemClickListener;


public class MainActivity extends Activity {

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    private GestureDetector gestureDetector;
    View.OnTouchListener gestureListener;
    private Animation slideLeftIn;
    private Animation slideLeftOut;
    private Animation slideRightIn;
    private Animation slideRightOut;
    private ViewFlipper viewFlipper;
    private ListView lv;
    private String[] city = { "Indore", "Bhopal", "Khargone", "Ujjain",
        "Nasik", "Pune", "Delhi", "Mumbai", "Noida", "Hyderabad",
        "Banglore", "Ajmer", "Goa", "Jaipur", "Nagpur", "" };
    private String[] country = { "India", "Bhutan", "Kuwait", "USA", };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        lv = (ListView) findViewById(R.id.List01);
        ListView lv2 = (ListView) findViewById(R.id.List02);

        viewFlipper = (ViewFlipper) findViewById(R.id.flipper);
        slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_left_in);
        slideLeftOut = AnimationUtils
                .loadAnimation(this, R.anim.slide_left_out);
        slideRightIn = AnimationUtils
                .loadAnimation(this, R.anim.slide_right_in);
        slideRightOut = AnimationUtils.loadAnimation(this,
                R.anim.slide_right_out);

        gestureDetector = new GestureDetector(new MyGestureDetector());
        gestureListener = new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                if (gestureDetector.onTouchEvent(event)) {
                    return true;
                }
                return false;
            }
        };
        lv.setAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, city));
        lv2.setAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, country));
        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView arg0, View view, int position,
                    long id) {
                // user clicked a list item, make it "selected"
                Toast.makeText(getBaseContext(), "Item Clicked",
                        Toast.LENGTH_SHORT).show();
                // selectedAdapter.setSelectedPosition(position);
            }
        });
        lv2.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView arg0, View view, int position,
                    long id) {
                // user clicked a list item, make it "selected"
                Toast.makeText(getBaseContext(), "Item List2 Clicked",
                        Toast.LENGTH_SHORT).show();
                // selectedAdapter.setSelectedPosition(position);
            }
        });
    }

    class MyGestureDetector extends SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
                // right to left swipe
                if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    viewFlipper.setInAnimation(slideLeftIn);
                    viewFlipper.setOutAnimation(slideLeftOut);
                    viewFlipper.showNext();
                } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    viewFlipper.setInAnimation(slideRightIn);
                    viewFlipper.setOutAnimation(slideRightOut);
                    viewFlipper.showPrevious();
                }
            } catch (Exception e) {
                // nothing
            }
            return false;
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (gestureDetector.onTouchEvent(event))
            return true;
        else
            return false;
    }
}

包括使用的布局(main_layout)......

 <?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Do not Click Just swipe on remaining area" />
    </LinearLayout>

    <ViewFlipper
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/flipper"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <LinearLayout
            android:id="@+id/ViewFlipper01"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" >

            <ListView
                android:id="@+id/List01"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" >
            </ListView>
        </LinearLayout>

关于Android ViewFlipper 不翻转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5563749/

有关Android ViewFlipper 不翻转的更多相关文章

  1. ruby - 需要为 Proc 实现 Haskell 的翻转 - 2

    Haskell的Prelude有一个有用的函数,可以交换函数的参数:http://zvon.org/other/haskell/Outputprelude/flip_f.html我需要在Ruby中做同样的事情。我不想仅仅定义一个自定义方法,而是想猴子修补Proc类,以便我可以将flip与Proc#curry一起使用。有点像f=lambda{|x,y|[x,y]}g=f.flip.curry.(2)为y提供一个值。我不知道如何重新打开Proc类来做到这一点。 最佳答案 classProcdeffliplambda{|x,y|self.

  2. javascript - 水平翻转 .​​getUserMedia 的网络摄像头图像流 - 2

    所以我一直在搞乱这个页面:https://tutorialzine.github.io/pwa-photobooth/基本上它的作用是激活您的网络摄像头并让您直接从流中拍摄快照,我为我的网络借用了它,但视频流被翻转了,我想镜像视频流以便感觉更好。注意:我是一个js新手,所以欢迎详细解释。这是代码,您可能必须使用Firefox而不是Chrome:$('.closecam').click(function(){$('.webcam__overlay').hide();}); $('.camera').click(function(){$('.webcam__overlay').show()

  3. javascript - jquery怎么做翻转效果? - 2

    我正在尝试模仿通常在具有面板的移动设备上发现的效果,当您单击一个按钮时它会旋转,而在另一侧它会显示一些其他信息。我发现了一些使用css转换和hereisanexample的代码js$('#signup').on('click',function(e){e.preventDefault();document.getElementById('side-2').className='flipflip-side-1';document.getElementById('side-1').className='flipflip-side-2';});$('#create').on('click',

  4. javascript - 为什么我不能使用带有多重选择器的 prop() 翻转检查属性? - 2

    我知道通常当需要多个类来选择不同的类时,我们使用,并且我也四处搜索以确保我没有记错但不知何故如果我使用,没有错误,但它不会检测到第二个选择,只检测到第一个。如果我分别调用这些类,那么代码就可以工作了。谁能告诉我我在jQuery上做错了什么?这有效。if(($('.use-remaining').prop("checked"))||(($('.use-briquettes').prop("checked")))){}但如果我这样做,它就不会工作if(($('.use-remaining,.use-briquettes').prop("checked"))){}我有三个复选框。在表单提交之

  5. javascript - 进行图像翻转的最佳方法? - 2

    我希望将鼠标悬停时更改主徽标。我知道有几种方法可以实现此目的,并且想知道哪种方法最稳定,浏览器兼容,效率更高,易于设置的最佳方法。我发现的一些方法是:用Javascript(jQuery)替换“src”属性。CSS使用背景和“悬停”还有吗什么才好 最佳答案 底线对于内容丰富的图像,您希望在HTML标记中包含src。您要使用Javascript解决方案,并将过渡图像放在属性中。对于无内容的图像UI元素,尤其是在站点中常见或重复的图像UI元素,最好使用直接的CSS解决方案(因此您不必在每次调用时都重新声明图像位置)。在CSS解决方案中,

  6. javascript - 如何翻转 Twitter Bootstrap 的工具提示 - 2

    我正在使用Twitter的Bootstrap来实现工具提示。目前,工具提示显示在链接上方。我希望工具提示出现在链接下方。我该怎么做呢?我正在触发工具提示,它清楚地指出“底部”,但它不想为我工作...$('#home').tooltip('hidebottom') 最佳答案 $('#tooltip').tooltip({placement:'left',title:'firsttooltip'});在内部使用标签,或在单独的JavaScript文件中。 关于javascript-如何翻转T

  7. javascript - 编写 jQuery rolodex 样式的时钟翻转动画? - 2

    我正在努力根据那些带有翻转数字的旧时钟制作一个简单的动画。我在下面添加了一张从PremiumPixels上找到的免费赠品PSD复制的图片:我遇到的最大问题是使用jQuery在HTML/CSS/JavaScript中构建“翻转”动画。我找到的唯一教程是fromthisnettuts+article实际上使用图像。它将时钟的上半部分和下半部分分成两个不同的图像集,并为经过的每一秒替换它们......这种方法在网站中是不现实的,因为它没有为读者提供实际的上下文。我更愿意将数字硬编码到HTML中并仅通过jQuery执行翻转动画-最好没有图像,除了背景自动收报机框。或者换句话说,数字被编码成HT

  8. javascript - jQuery 翻转插件开关功能在开关上失败 - 2

    我有一段代码,其中有两个按钮,当我按下一个按钮时,我希望一个div在y轴上翻转,当我按下另一个按钮时,我希望同一个div在x轴上翻转.当我使用按钮作为y轴时,即使之前的翻转位于x轴上,这也能正常工作。但是当我想从y轴切换到x轴时,我需要按两次x按钮,因为第一次没有任何反应。所以期望的行为是:单击y按钮在y轴上翻转div。单击x按钮在x轴上翻转div。当前行为是:单击y按钮div在y轴上翻转。点击x按钮没有任何反应再次单击x按钮div在x轴上翻转。我不知道问题出在哪里,这是迄今为止我得到的最好的。感谢所有帮助。varax='x';$(document).ready(function(){

  9. javascript - 如果手动切换翻转开关,如何仅触发事件 - 2

    我创建了一个像这样的jQueryMobile翻转开关LionRose我听着这个翻转开关的变化$(document).on('change','#flip',function(e){console.log('changed');}但我不希望如果我将翻转开关的值更改为$('#flip').val('flower').flipswitch('refresh');如何通过直接与翻转开关交互或设置值并刷新翻转开关来检查翻转开关是否已更改?我在thisJSFiddle下创建了一个不良行为示例. 最佳答案 您需要使用.on()附加change事件

  10. javascript - 使用 css 和 javascript 将 div 翻转 180 度 - 2

    我想使用触发css动画的javascript函数将div翻转180度。我的div有以下声明:.start-photo-thumb{position:relative;float:left;background:#444444;height:192px;width:192px;margin-right:10px;margin-bottom:10px;perspective:1000px;animation:rotating0.6slinearinfinite;animation-play-state:paused;}@keyframesrotating{from{transform:ro

随机推荐