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