我想创建一个HorizontalScrollView
,但其中包含一些“效果”,例如此example或此other example。问题是我不知道我必须使用多少物品;我从API获取ImageView
因此它应该是动态的。我怎样才能产生这样的效果:如果它被选中,那么下面的TextView
会变得更大?我在SO上找到的最接近的例子是here。这正是我所需要的,但我已经测试了给出的答案,但它对我不起作用......但问题中的图像正是我想要的。任何人都可以指导我这样做吗?
假设我将使用5 ImageView
仅测试进行测试,因此动态添加ImageView
的示例对我也有好处。
另一个例子是Snapchat APP,但不同之处在于我想对选定的内容添加一些效果,例如将其设置为更大或类似。
我想得到一个示例,如何使用布局(适配器)自定义HorizontalScrollView,如果可能为点击的一个添加效果最重要,我想要适配器,因为我需要当然点击该项目。我认为我应该使用RecycleView作为@UncaughtException的东西对我说,因为我不知道我会得到多少图像,我将不得不戴上我的APP所以我认为这是解决方案。
这将是Snapchat HoritzontalScrollView和This image from a SO question
之间的混合答案 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
的功能,
以上只是一些可能需要调整的演示代码,请告诉我这是否有帮助或进一步询问......
还添加了输出的屏幕截图..
答案 1 :(得分:3)
第1步:
在ViewPager
中水平显示图像。
第2步:
将ScaleAnimation
类应用于单击的项目以放大它。这可以在instantiateItem()
的{{1}}的{{1}}方法中完成。
此外,还有一些可用的开源小部件,例如CoverFlow
和FancyCoverFlow
。您可能需要查看源代码以了解它们的工作原理。
修改强>
首先,关于如何处理未知数量的图片的问题,您应该意识到在所有这些小部件中(ViewPager
,PagerAdapter
,ListView
等),数字来自API的对象一开始总是未知的,即在接收到API响应时就知道了。因此,如果您首先以正常方式实施GridView
,您将看到如何处理此问题。基本上,您必须使用ViewPager
和模型对象来填充ViewPager
或Adapter
。 API响应将是JSON或XML,解析后,您将知道确切的项目数。
所以我认为你应该首先以正常方式实现ViewPager
。可以使用任意数量的示例。两个有趣的是this one和this one。它们对您的案例很有意思,因为它们还包含如何放大图像的示例代码。
现在遇到第二个问题:我们如何扩大图像。要做到这一点,一种方法是使用ListView
类。例如,假设你想围绕其中心放大100%的图像:
ViewPager
我会在ScaleAnimation
的{{1}}的{{1}}方法中使用此代码。这应该工作。或者您可以在前两个示例之一中尝试缩放动画方法。
我担心您将不得不尝试使用这些示例作为指南创建一个工作项目。然后我们可以进一步讨论您遇到的任何其他问题。我确信这可以很容易地完成,我知道你可以做到。最好......
编辑2: