Horizo​​ntalScrollView还是Carrousel?

时间:2015-10-19 16:58:17

标签: android android-viewpager android-animation android-imageview

我想创建一个HorizontalScrollView,但其中包含一些“效果”,例如此example或此other example。问题是我不知道我必须使用多少物品;我从API获取ImageView因此它应该是动态的。我怎样才能产生这样的效果:如果它被选中,那么下面的TextView会变得更大?我在SO上找到的最接近的例子是here。这正是我所需要的,但我已经测试了给出的答案,但它对我不起作用......但问题中的图像正是我想要的。任何人都可以指导我这样做吗?

假设我将使用5 ImageView 仅测试进行测试,因此动态添加ImageView的示例对我也有好处。

另一个例子是Snapchat APP,但不同之处在于我想对选定的内容添加一些效果,例如将其设置为更大或类似。

修改

我想得到一个示例,如何使用布局(适配器)自定义Horizo​​ntalScrollView,如果可能为点击的一个添加效果最重要,我想要适配器,因为我需要当然点击该项目。我认为我应该使用RecycleView作为@UncaughtException的东西对我说,因为我不知道我会得到多少图像,我将不得不戴上我的APP所以我认为这是解决方案。

这将是Snapchat HoritzontalScrollViewThis image from a SO question

之间的混合

2 个答案:

答案 0 :(得分:7)

在您的情况下,您肯定可以使用ViewPager,但如果我是你,我会RecyclerView使用LinearLayoutManager,其方向设置为Horizontal,所以你不需要HorizontalScrollView,并且使用RecyclerView您还可以获得正在寻找的adapter内容。

现在为了scale或对click显示其他效果以区别于其他人,您可以Animate该特定视图,

我已经为此写了一些演示代码,在这里发布了所需的文件,让我知道这是否是你想要的,

<强>活动

/**
  * Created by Satyen on 10/27/15.
  **/
public class SlidingDrawerActivity extends Activity {

   RecyclerView rcyList;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_scroll_list);

        rcyList = (RecyclerView) findViewById(R.id.rcyList);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        rcyList.setLayoutManager(layoutManager);

       /* rcyList.addItemDecoration(
                new DividerItemDecoration(this, null));*/
        MyRecyclerViewAdapter myRecyclerAdapter = new MyRecyclerViewAdapter(this);
        rcyList.setAdapter(myRecyclerAdapter);

    }


}

活动布局

<!-- layout_scroll_list.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">

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:layout_weight="1">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rcyList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="@android:color/holo_blue_dark"
        android:paddingLeft="8dp"
        android:paddingRight="8dp" />

</FrameLayout>
</LinearLayout>

<强>适配器

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.CustomViewHolder> {

private Context mContext;
View animatedView = null;

public MyRecyclerViewAdapter(Context context) {
    this.mContext = context;
}

@Override
public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, final int i) {
    final View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, null);


    CustomViewHolder viewHolder = new CustomViewHolder(view);
    /*final Animation a = AnimationUtils.loadAnimation(mContext, R.anim.scale_up);*/
    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            // You can tweak with the effects here
            if (animatedView == null) {
                animatedView = view;
            } else {
                animatedView.setAnimation(null);
                animatedView = view;
            }
            ScaleAnimation fade_in = new ScaleAnimation(1f, 1.3f, 1f, 1.3f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            fade_in.setDuration(100);     // animation duration in milliseconds
            fade_in.setFillAfter(true);    // If fillAfter is true, the transformation that this animation performed will persist when it is finished.
            view.startAnimation(fade_in);
        }
    });
    return viewHolder;
}

@Override
public void onBindViewHolder(CustomViewHolder customViewHolder, int i) {
    //Setting text view title
    customViewHolder.textView.setText("Data No. " + i);
}

@Override
public int getItemCount() {
    return 10;
}

public class CustomViewHolder extends RecyclerView.ViewHolder {
    protected ImageView imageView;
    protected TextView textView;

    public CustomViewHolder(View view) {
        super(view);
        this.imageView = (ImageView) view.findViewById(R.id.thumbnail);
        this.textView = (TextView) view.findViewById(R.id.title);
    }
}
}

适配器行布局

<!-- list_row.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="100dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="vertical">

<RelativeLayout
    android:layout_width="80dp"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/thumbnail"
        android:layout_width="100dp"
        android:layout_height="80dp"
        android:layout_alignParentLeft="true"
        android:layout_centerInParent="true"
        android:scaleType="centerCrop"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/thumbnail"
        android:layout_centerHorizontal="true"
        android:text="dafdafda"
        android:textColor="#222"
        android:textSize="12sp" />

</RelativeLayout>

</LinearLayout>

除了您之外,您还可以使用TwoWayView来提供实施HorizontalListView的功能,

以上只是一些可能需要调整的演示代码,请告诉我这是否有帮助或进一步询问......

还添加了输出的屏幕截图..

Layout when none of the item is clicked

Layout when second item is clicked

答案 1 :(得分:3)

第1步:

ViewPager中水平显示图像。

第2步:

ScaleAnimation类应用于单击的项目以放大它。这可以在instantiateItem()的{​​{1}}的{​​{1}}方法中完成。

此外,还有一些可用的开源小部件,例如CoverFlowFancyCoverFlow。您可能需要查看源代码以了解它们的工作原理。

修改

首先,关于如何处理未知数量的图片的问题,您应该意识到在所有这些小部件中(ViewPagerPagerAdapterListView等),数字来自API的对象一开始总是未知的,即在接收到API响应时就知道了。因此,如果您首先以正常方式实施GridView,您将看到如何处理此问题。基本上,您必须使用ViewPager和模型对象来填充ViewPagerAdapter。 API响应将是JSON或XML,解析后,您将知道确切的项目数。

所以我认为你应该首先以正常方式实现ViewPager。可以使用任意数量的示例。两个有趣的是this onethis one。它们对您的案例很有意思,因为它们还包含如何放大图像的示例代码。

现在遇到第二个问题:我们如何扩大图像。要做到这一点,一种方法是使用ListView类。例如,假设你想围绕其中心放​​大100%的图像:

ViewPager

我会在ScaleAnimation的{​​{1}}的{​​{1}}方法中使用此代码。这应该工作。或者您可以在前两个示例之一中尝试缩放动画方法。

我担心您将不得不尝试使用这些示例作为指南创建一个工作项目。然后我们可以进一步讨论您遇到的任何其他问题。我确信这可以很容易地完成,我知道你可以做到。最好......

编辑2:

根据您提供的两个示例,您看过thisthis了吗?这就是你要找的东西吗?它能让你更接近解决这个问题吗?