Android StackView类型的水平滑动布局

Android StackView类型的水平滑动布局,android,android-layout,android-listview,Android,Android Layout,Android Listview,我正在构建一个Android应用程序,它需要一个“卡片组”UI小部件 这是对活动/布局示例的请求,可以执行以下操作: 1)垂直滑动支持: 列出一组可以垂直滚动/刷卡的卡。StackView可以做到这一点,但我愿意接受任何行之有效的解决方案(例如,一些CardUI项目) 2)水平滑动支持: 对于任何卡片,有两种字典定义: 如果我们向左滑动-那么我们可以看到定义a 如果我们右击,就会看到定义B 水平刷卡更新不会更新整个屏幕布局,只会更新已刷卡的卡。因此,如果我向右滑动Card2以查看A2,则A2后

我正在构建一个Android应用程序,它需要一个“卡片组”UI小部件

这是对活动/布局示例的请求,可以执行以下操作:

1)垂直滑动支持:

列出一组可以垂直滚动/刷卡的卡。StackView可以做到这一点,但我愿意接受任何行之有效的解决方案(例如,一些CardUI项目)

2)水平滑动支持:

对于任何卡片,有两种字典定义:

  • 如果我们向左滑动-那么我们可以看到定义a
  • 如果我们右击,就会看到定义B
  • 水平刷卡更新不会更新整个屏幕布局,只会更新已刷卡的卡。因此,如果我向右滑动Card2以查看A2,则A2后面仍有Card1
例如:

[A1][Card1][B1]
[A2][Card2][B2]
[A3][Card3][B3]

我确实看到了这一点,那里的答案提供了一些提示和参考信息。。但不幸的是,我仍在努力解决这个问题。

您有两种可能的方法:采用一些开源项目并根据您的需要进行调整,或者,根据详细教程将您的刷卡构建为图像滑块

对于第一个选项,请查看Github,在那里您将发现几个小项目,它们通常在垂直或水平滚动上完成一副卡片。我想你可能会对以下项目感兴趣:

  • CardDeck:适用于Android

  • DeckPicker:一个完整的android anki droid项目,在浏览器屏幕上增加了一些卡片预览功能。在预览屏幕中,卡片将像窗口上的查看模式一样显示

最后,如果您所做的其他更改看起来不错,那么向原始项目提交一个补丁是值得的

对于第二种选择,对于您喜欢从头开始实施的情况,请采取简单的步骤,将您的项目扩展为更具体/复杂的细节,并根据您的意愿进行定制。全屏图像滑块适合账单,包括查看页面的活动:

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

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>
activity\u fullscreen\u view.xml
使用全屏查看器:

public class FullScreenImageAdapter extends PagerAdapter {

    private Activity _activity;
    private ArrayList<String> _imagePaths;
    private LayoutInflater inflater;

    // constructor
    public FullScreenImageAdapter(Activity activity,
            ArrayList<String> imagePaths) {
        this._activity = activity;
        this._imagePaths = imagePaths;
    }

    @Override
    public int getCount() {
        return this._imagePaths.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((RelativeLayout) object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ImageView imgDisplay;
        Button btnClose;

        inflater = (LayoutInflater) _activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container,
                false);

        imgDisplay = (ImageView) viewLayout.findViewById(R.id.imgDisplay);
        btnClose = (Button) viewLayout.findViewById(R.id.btnClose);

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        Bitmap bitmap = BitmapFactory.decodeFile(_imagePaths.get(position), options);
        imgDisplay.setImageBitmap(bitmap);

        // close button click event
        btnClose.setOnClickListener(new View.OnClickListener() {           
            @Override
            public void onClick(View v) {
                _activity.finish();
            }
        });

        ((ViewPager) container).addView(viewLayout);

        return viewLayout;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((RelativeLayout) object);

    }
}
公共类FullScreenImageAdapter扩展了PagerAdapter{
私人活动;
私有ArrayList_ImagePath;
私人充气机;
//建造师
公共FullScreenImageAdapter(活动,
ArrayList图像路径){
这个。_活动=活动;
这是。_imagepath=imagepath;
}
@凌驾
public int getCount(){
返回此项。_imagepath.size();
}
@凌驾
公共布尔值isViewFromObject(视图,对象){
返回视图==((RelativeLayout)对象);
}
@凌驾
公共对象实例化项(视图组容器,int位置){
图像视图imgDisplay;
按钮关闭;
充气器=(充气器)\u活动
.getSystemService(上下文布局\充气机\服务);
查看视图布局=充气机。充气(R.layout.layout\u全屏图像,容器,
假);
imgDisplay=(ImageView)viewLayout.findViewById(R.id.imgDisplay);
btnClose=(按钮)viewLayout.findViewById(R.id.btnClose);
BitmapFactory.Options=new-BitmapFactory.Options();
options.inPreferredConfig=Bitmap.Config.ARGB_8888;
位图位图=位图工厂.decodeFile(_imagepath.get(位置),选项);
设置图像位图(位图);
//关闭按钮单击事件
btnClose.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
_activity.finish();
}
});
((ViewPager)容器)。添加视图(viewLayout);
返回视图布局;
}
@凌驾
公共项(视图组容器、int位置、对象){
((ViewPager)容器)。移除视图((RelativeLayout)对象);
}
}
然后实现图像滑动,如:

要添加垂直运动,只需添加其他垂直布局:

main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

    <TextView

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="Swipe Demo"

        android:gravity="center"

        android:layout_margin="10dip" />

        <LinearLayout

            android:layout_width="fill_parent"

            android:layout_height="fill_parent"

            android:orientation="vertical"

            android:gravity="center">

                 <ImageView

                     android:layout_width="wrap_content"

                     android:layout_height="wrap_content"

                     android:layout_gravity="center"

                     android:gravity="center"

                     android:layout_margin="10dip"

                     android:id="@+id/image_place_holder"/>

           </LinearLayout>

</LinearLayout>
main.xml
这将允许您滑动物品:

在一天结束时,你想要的是一个网格,比如垂直和水平滚动。为此,您必须将垂直和水平滑动组合为:


采取这些步骤并将其结合起来,将使您能够实现所需的效果。

尝试此示例代码-

public class Main extends Activity {

    int position=0;
    LinearLayout full;
    Intent intent;

    public Integer[] images= {
                R.drawable.image1, R.drawable.image2,
                R.drawable.image3, R.drawable.image4,
                R.drawable.image5, R.drawable.image6
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);      
        full = (LinearLayout) findViewById(R.id.full);
        changeImage();
        ActivitySwipeDetector activitySwipeDetector = new ActivitySwipeDetector(this);
        full.setOnTouchListener(activitySwipeDetector);
    }



    private void changeImage(){
        full.setBackgroundResource(images[position]);
   }

    public class ActivitySwipeDetector implements View.OnTouchListener {

        static final String logTag = "ActivitySwipeDetector";
        static final int MIN_DISTANCE = 100;
        private float downX, upX;
        Activity activity;

        public ActivitySwipeDetector(Activity activity){
            this.activity = activity;
        }

        public void onRightToLeftSwipe(){
            Log.i(logTag, "RightToLeftSwipe!");
            if(position < images.length - 1){
                position++;
                 changeImage();
            }
    }

        public void onLeftToRightSwipe(){
            Log.i(logTag, "LeftToRightSwipe!");
            if(position > 0){
                position--;
                changeImage();
           }
        }

        public boolean onTouch(View v, MotionEvent event) {
            switch(event.getAction()){
                case MotionEvent.ACTION_DOWN: {
                    downX = event.getX();
                    return true;
                }
                case MotionEvent.ACTION_UP: {
                    upX = event.getX();

                    float deltaX = downX - upX;

                    // swipe horizontal?
                    if(Math.abs(deltaX) > MIN_DISTANCE){
                        // left or right
                        if(deltaX < 0) { this.onLeftToRightSwipe(); return true; }
                        if(deltaX > 0) { this.onRightToLeftSwipe(); return true; }
                    }
                    else {
                            Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
                            return false; // We don't consume the event
                    }


                    return true;
                }
            }
            return false;
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override 
    public void onResume()
    {
        super.onResume();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    @Override 
    public void onBackPressed() {
        super.onBackPressed();
    }       
}
public类主扩展活动{
int位置=0;
线性布局完整;
意图;
公共整数[]图像={
R.drawable.image1,R.drawable.image2,
R.drawable.image3,R.drawable.image4,
R.drawable.image5,R.drawable.image6
};
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
full=(线性布局)findViewById(R.id.full);
changeImage();
ActivitySwipeDetector ActivitySwipeDetector=新ActivitySwipeDetector(此);
full.setOnTouchListener(activitySwipeDetector);
}
私有void changeImage(){
完整。挫折背景资源(图像[位置]);
}
公共类ActivitySwipeDetector实现View.OnTouchListener{
静态最终字符串logTag=“ActivitySwipedTector”;
静态最终内部最小距离=100;
私人浮动下行,上行;
活动;
公共活动SwipeDetector(活动){
这个。活动=活动;
}
public void onRightToLeftSwipe(){
Log.i(logTag,“rightoleftsweep!”);
我
public class Main extends Activity {

    int position=0;
    LinearLayout full;
    Intent intent;

    public Integer[] images= {
                R.drawable.image1, R.drawable.image2,
                R.drawable.image3, R.drawable.image4,
                R.drawable.image5, R.drawable.image6
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);      
        full = (LinearLayout) findViewById(R.id.full);
        changeImage();
        ActivitySwipeDetector activitySwipeDetector = new ActivitySwipeDetector(this);
        full.setOnTouchListener(activitySwipeDetector);
    }



    private void changeImage(){
        full.setBackgroundResource(images[position]);
   }

    public class ActivitySwipeDetector implements View.OnTouchListener {

        static final String logTag = "ActivitySwipeDetector";
        static final int MIN_DISTANCE = 100;
        private float downX, upX;
        Activity activity;

        public ActivitySwipeDetector(Activity activity){
            this.activity = activity;
        }

        public void onRightToLeftSwipe(){
            Log.i(logTag, "RightToLeftSwipe!");
            if(position < images.length - 1){
                position++;
                 changeImage();
            }
    }

        public void onLeftToRightSwipe(){
            Log.i(logTag, "LeftToRightSwipe!");
            if(position > 0){
                position--;
                changeImage();
           }
        }

        public boolean onTouch(View v, MotionEvent event) {
            switch(event.getAction()){
                case MotionEvent.ACTION_DOWN: {
                    downX = event.getX();
                    return true;
                }
                case MotionEvent.ACTION_UP: {
                    upX = event.getX();

                    float deltaX = downX - upX;

                    // swipe horizontal?
                    if(Math.abs(deltaX) > MIN_DISTANCE){
                        // left or right
                        if(deltaX < 0) { this.onLeftToRightSwipe(); return true; }
                        if(deltaX > 0) { this.onRightToLeftSwipe(); return true; }
                    }
                    else {
                            Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
                            return false; // We don't consume the event
                    }


                    return true;
                }
            }
            return false;
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override 
    public void onResume()
    {
        super.onResume();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    @Override 
    public void onBackPressed() {
        super.onBackPressed();
    }       
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/full"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerInside"
    android:orientation="vertical" />