GridView的放大图片 [英] GridView Zoom Images
问题描述
我有一个GridView和我试图缩小在GridView的项目点击图片。使用从谷歌 http://developer.android.com/training/animation/zoom此样本。 HTML 。我的问题是,你如何传递到R.drawableINT imageResId。看看我的$ C $以下CS。
MainActivity.java
公共类GridViewActivity延伸活动{ @覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState); 的setTitle(GridView的);
的setContentView(R.layout.grid_view);
GridView控件的GridView =(GridView控件)findViewById(R.id.gridview);
gridview.setAdapter(新ImageAdapter(本)); }
@覆盖
公共布尔onCreateOptionsMenu(菜单菜单){
。getMenuInflater()膨胀(R.menu.activity_grid_view,菜单);
返回true;
}
}
gridview.xml
< GridView控件的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:ID =@ + ID / GridView控件
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT
机器人:columnWidth时=90dp
机器人:为numColumns =auto_fit
机器人:verticalSpacing =10dp
机器人:horizontalSpacing =10dp
机器人:stretchMode =columnWidth时
机器人:比重=中心
/>
ImageAdapter.java
公共类ImageAdapter延伸BaseAdapter { 民营动画mCurrentAnimator; 私人诠释mShortAnimationDuration; 私人语境mContext; 公共ImageAdapter(上下文C){
mContext = C;
} 公众诠释的getCount(){
返回mThumbIds.length;
} 公共对象的getItem(INT位置){
返回mThumbIds [位置]
} 众长getItemId(INT位置){
返回0;
} 公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup){
ImageView的ImageView的;
如果(convertView == NULL){
ImageView的=新ImageView的(mContext);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
}其他{
ImageView的=(ImageView的)convertView;
} imageView.setImageResource(mThumbIds [位置]);
imageView.setTag(mThumbIds [位置]);
imageView.setOnClickListener(新OnClickListener(){ @覆盖
公共无效的onClick(查看为arg0){
INT ID =(整数)arg0.getTag();
zoomImageFromThumb(arg0中,ID);
}
});
返回ImageView的;
} //引用我们在res&GT图像;绘制
公共整数[] = mThumbIds {R.drawable.sample_0,R.drawable.sample_1,
R.drawable.sample_2,R.drawable.sample_3,R.drawable.sample_4,
R.drawable.sample_5,R.drawable.sample_6,R.drawable.sample_7,
R.drawable.sample_8,R.drawable.sample_9,R.drawable.sample_10,
R.drawable.sample_11,R.drawable.sample_12,R.drawable.sample_13,
R.drawable.sample_14,R.drawable.sample_15,R.drawable.sample_16,
R.drawable.sample_17,R.drawable.sample_18}; 私人无效zoomImageFromThumb(最终查看thumbView,诠释imageResId){ 如果(mCurrentAnimator!= NULL){
mCurrentAnimator.cancel();
} 最后ImageView的expandedImageView =(ImageView的)thumbView.findViewById(R.id.expanded_image);
expandedImageView.setImageResource(imageResId); 最后矩形startBounds =新的矩形();
最后矩形finalBounds =新的矩形();
最后一点globalOffset =新点(); thumbView.getGlobalVisibleRect(startBounds);
thumbView.findViewById(R.id.container).getGlobalVisibleRect(finalBounds,globalOffset);
startBounds.offset(-globalOffset.x,-globalOffset.y);
finalBounds.offset(-globalOffset.x,-globalOffset.y); 浮startScale;
如果((浮点)finalBounds.width()/ finalBounds.height()>(浮点)startBounds
.WIDTH()/ startBounds.height()){
//沿水平方向延伸的边界开始
startScale =(浮点)startBounds.height()/ finalBounds.height();
浮startWidth = startScale * finalBounds.width();
浮deltaWidth =(startWidth - startBounds.width())/ 2;
startBounds.left - = deltaWidth;
startBounds.right + = deltaWidth;
}其他{
//开始扩展垂直范围
startScale =(浮点)startBounds.width()/ finalBounds.width();
浮startHeight = startScale * finalBounds.height();
浮deltaHeight =(startHeight - startBounds.height())/ 2;
startBounds.top - = deltaHeight;
startBounds.bottom + = deltaHeight;
} thumbView.setAlpha(0F);
expandedImageView.setVisibility(View.VISIBLE); expandedImageView.setPivotX(0F);
expandedImageView.setPivotY(0F); AnimatorSet套=新AnimatorSet();
set.play(
ObjectAnimator.ofFloat(expandedImageView,View.X,
startBounds.left,finalBounds.left))
。随着(ObjectAnimator.ofFloat(expandedImageView,View.Y,
startBounds.top,finalBounds.top))
。随着(ObjectAnimator.ofFloat(expandedImageView,View.SCALE_X,
startScale,1F))
。随着(ObjectAnimator.ofFloat(expandedImageView,View.SCALE_Y,
startScale,1F));
set.setDuration(mShortAnimationDuration);
set.setInterpolator(新DecelerateInterpolator());
set.addListener(新AnimatorListenerAdapter(){
@覆盖
公共无效onAnimationEnd(动画动画){
mCurrentAnimator = NULL;
} @覆盖
公共无效onAnimationCancel(动画动画){
mCurrentAnimator = NULL;
}
});
set.start();
mCurrentAnimator =集; 最终浮动startScaleFinal = startScale;
expandedImageView.setOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(查看视图){
如果(mCurrentAnimator!= NULL){
mCurrentAnimator.cancel();
} AnimatorSet套=新AnimatorSet();
set.play(
ObjectAnimator.ofFloat(expandedImageView,View.X,
startBounds.left))
。随着(ObjectAnimator.ofFloat(expandedImageView,View.Y,
startBounds.top))
。随着(ObjectAnimator.ofFloat(expandedImageView,
View.SCALE_X,startScaleFinal))
。随着(ObjectAnimator.ofFloat(expandedImageView,
View.SCALE_Y,startScaleFinal));
set.setDuration(mShortAnimationDuration);
set.setInterpolator(新DecelerateInterpolator());
set.addListener(新AnimatorListenerAdapter(){
@覆盖
公共无效onAnimationEnd(动画动画){
thumbView.setAlpha(1F);
expandedImageView.setVisibility(View.GONE);
mCurrentAnimator = NULL;
} @覆盖
公共无效onAnimationCancel(动画动画){
thumbView.setAlpha(1F);
expandedImageView.setVisibility(View.GONE);
mCurrentAnimator = NULL;
}
});
set.start();
mCurrentAnimator =集;
}
});
}
}
activity_zoom.xml
<的FrameLayout的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:ID =@ + ID /容器
机器人:layout_width =match_parent
机器人:layout_height =match_parent> < ImageView的
机器人:ID =@ + ID / expanded_image
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:知名度=隐形/>< /&的FrameLayout GT;
logcat的:
13 06-14:58:47.667:E / AndroidRuntime(14860):致命异常:主要
06-14 13:58:47.667:E / AndroidRuntime(14860):显示java.lang.NullPointerException
06-14 13:58:47.667:E / AndroidRuntime(14860):在com.example.gridview.ImageAdapter.zoomImageFromThumb(ImageAdapter.java:79)
06-14 13:58:47.667:E / AndroidRuntime(14860):在com.example.gridview.ImageAdapter.access $ 0(ImageAdapter.java:72)
06-14 13:58:47.667:E / AndroidRuntime(14860):在com.example.gridview.ImageAdapter $ 1.onClick(ImageAdapter.java:57)
06-14 13:58:47.667:E / AndroidRuntime(14860):在android.view.View.performClick(View.java:3620)
06-14 13:58:47.667:E / AndroidRuntime(14860):在android.view.View $ PerformClick.run(View.java:14292)
06-14 13:58:47.667:E / AndroidRuntime(14860):在android.os.Handler.handleCallback(Handler.java:605)
06-14 13:58:47.667:E / AndroidRuntime(14860):在android.os.Handler.dispatchMessage(Handler.java:92)
06-14 13:58:47.667:E / AndroidRuntime(14860):在android.os.Looper.loop(Looper.java:137)
06-14 13:58:47.667:E / AndroidRuntime(14860):在android.app.ActivityThread.main(ActivityThread.java:4507)
06-14 13:58:47.667:E / AndroidRuntime(14860):在java.lang.reflect.Method.invokeNative(本机方法)
06-14 13:58:47.667:E / AndroidRuntime(14860):在java.lang.reflect.Method.invoke(Method.java:511)
06-14 13:58:47.667:E / AndroidRuntime(14860):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:980)
06-14 13:58:47.667:E / AndroidRuntime(14860):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
06-14 13:58:47.667:E / AndroidRuntime(14860):在dalvik.system.NativeStart.main(本机方法)
尝试这个为例的,你发现你的扩展点击视图中查看
最后的ImageView expandedImageView =(ImageView的)findViewById(R.id.expanded_image);
expandedImageView.setImageResource(imageResId);
在 zoomImageFromThumb(最终查看thumbView,INT imageResId)
或者,你可能需要找到像
在主片段观点,看法 最后的ImageView expandedImageView =(ImageView的)mainView.findViewById(R.id.expanded_image);
expandedImageView.setImageResource(imageResId);
不是 thumbView
。
编辑:
更改 gridview.xml
如下,把双方意见相同的布局
< GridView控件的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:ID =@ + ID / GridView控件
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT
机器人:columnWidth时=90dp
机器人:为numColumns =auto_fit
机器人:verticalSpacing =10dp
机器人:horizontalSpacing =10dp
机器人:stretchMode =columnWidth时
机器人:比重=中心
/>< ImageView的
机器人:ID =@ + ID / expanded_image
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:知名度=隐形/>
您可以使用相对布局包装为这样一个与其他重叠
和使用
最后的ImageView expandedImageView =(ImageView的)findViewById(R.id.expanded_image);
expandedImageView.setImageResource(imageResId);
在 zoomImageFromThumb(最终查看thumbView,INT imageResId)
如果你的符号没有找到 findViewById()
错误,再加入
公共静态活动getActivity(){
在
返回此;
} GridViewActivity.java
,然后用
最后的ImageView expandedImageView =(ImageView的)GridViewActivity.getActivity()findViewById(R.id.expanded_image)。
expandedImageView.setImageResource(imageResId);
在 zoomImageFromThumb(最终查看thumbView,INT imageResId)
I've got a gridview and I'm trying to zoom the image on GridView Item Click. Using this sample from google http://developer.android.com/training/animation/zoom.html .My question is how do you pass a R.drawable into "int imageResId" . Check out my codes below.
MainActivity.java
public class GridViewActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("GridView");
setContentView(R.layout.grid_view);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_grid_view, menu);
return true;
}
}
gridview.xml
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
ImageAdapter.java
public class ImageAdapter extends BaseAdapter {
private Animator mCurrentAnimator;
private int mShortAnimationDuration;
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return mThumbIds[position];
}
public long getItemId(int position) {
return 0;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mThumbIds[position]);
imageView.setTag(mThumbIds[position]);
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
int id = (Integer) arg0.getTag();
zoomImageFromThumb(arg0, id);
}
});
return imageView;
}
// References to our images in res > drawable
public Integer[] mThumbIds = { R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3, R.drawable.sample_4,
R.drawable.sample_5, R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_8, R.drawable.sample_9, R.drawable.sample_10,
R.drawable.sample_11, R.drawable.sample_12, R.drawable.sample_13,
R.drawable.sample_14, R.drawable.sample_15, R.drawable.sample_16,
R.drawable.sample_17, R.drawable.sample_18 };
private void zoomImageFromThumb(final View thumbView, int imageResId) {
if (mCurrentAnimator != null) {
mCurrentAnimator.cancel();
}
final ImageView expandedImageView = (ImageView) thumbView.findViewById(R.id.expanded_image);
expandedImageView.setImageResource(imageResId);
final Rect startBounds = new Rect();
final Rect finalBounds = new Rect();
final Point globalOffset = new Point();
thumbView.getGlobalVisibleRect(startBounds);
thumbView.findViewById(R.id.container).getGlobalVisibleRect(finalBounds, globalOffset);
startBounds.offset(-globalOffset.x, -globalOffset.y);
finalBounds.offset(-globalOffset.x, -globalOffset.y);
float startScale;
if ((float) finalBounds.width() / finalBounds.height() > (float) startBounds
.width() / startBounds.height()) {
// Extend start bounds horizontally
startScale = (float) startBounds.height() / finalBounds.height();
float startWidth = startScale * finalBounds.width();
float deltaWidth = (startWidth - startBounds.width()) / 2;
startBounds.left -= deltaWidth;
startBounds.right += deltaWidth;
} else {
// Extend start bounds vertically
startScale = (float) startBounds.width() / finalBounds.width();
float startHeight = startScale * finalBounds.height();
float deltaHeight = (startHeight - startBounds.height()) / 2;
startBounds.top -= deltaHeight;
startBounds.bottom += deltaHeight;
}
thumbView.setAlpha(0f);
expandedImageView.setVisibility(View.VISIBLE);
expandedImageView.setPivotX(0f);
expandedImageView.setPivotY(0f);
AnimatorSet set = new AnimatorSet();
set.play(
ObjectAnimator.ofFloat(expandedImageView, View.X,
startBounds.left, finalBounds.left))
.with(ObjectAnimator.ofFloat(expandedImageView, View.Y,
startBounds.top, finalBounds.top))
.with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X,
startScale, 1f))
.with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_Y,
startScale, 1f));
set.setDuration(mShortAnimationDuration);
set.setInterpolator(new DecelerateInterpolator());
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mCurrentAnimator = null;
}
@Override
public void onAnimationCancel(Animator animation) {
mCurrentAnimator = null;
}
});
set.start();
mCurrentAnimator = set;
final float startScaleFinal = startScale;
expandedImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mCurrentAnimator != null) {
mCurrentAnimator.cancel();
}
AnimatorSet set = new AnimatorSet();
set.play(
ObjectAnimator.ofFloat(expandedImageView, View.X,
startBounds.left))
.with(ObjectAnimator.ofFloat(expandedImageView, View.Y,
startBounds.top))
.with(ObjectAnimator.ofFloat(expandedImageView,
View.SCALE_X, startScaleFinal))
.with(ObjectAnimator.ofFloat(expandedImageView,
View.SCALE_Y, startScaleFinal));
set.setDuration(mShortAnimationDuration);
set.setInterpolator(new DecelerateInterpolator());
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
thumbView.setAlpha(1f);
expandedImageView.setVisibility(View.GONE);
mCurrentAnimator = null;
}
@Override
public void onAnimationCancel(Animator animation) {
thumbView.setAlpha(1f);
expandedImageView.setVisibility(View.GONE);
mCurrentAnimator = null;
}
});
set.start();
mCurrentAnimator = set;
}
});
}
}
activity_zoom.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/expanded_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="invisible" />
</FrameLayout>
LOGCAT :
06-14 13:58:47.667: E/AndroidRuntime(14860): FATAL EXCEPTION: main
06-14 13:58:47.667: E/AndroidRuntime(14860): java.lang.NullPointerException
06-14 13:58:47.667: E/AndroidRuntime(14860): at com.example.gridview.ImageAdapter.zoomImageFromThumb(ImageAdapter.java:79)
06-14 13:58:47.667: E/AndroidRuntime(14860): at com.example.gridview.ImageAdapter.access$0(ImageAdapter.java:72)
06-14 13:58:47.667: E/AndroidRuntime(14860): at com.example.gridview.ImageAdapter$1.onClick(ImageAdapter.java:57)
06-14 13:58:47.667: E/AndroidRuntime(14860): at android.view.View.performClick(View.java:3620)
06-14 13:58:47.667: E/AndroidRuntime(14860): at android.view.View$PerformClick.run(View.java:14292)
06-14 13:58:47.667: E/AndroidRuntime(14860): at android.os.Handler.handleCallback(Handler.java:605)
06-14 13:58:47.667: E/AndroidRuntime(14860): at android.os.Handler.dispatchMessage(Handler.java:92)
06-14 13:58:47.667: E/AndroidRuntime(14860): at android.os.Looper.loop(Looper.java:137)
06-14 13:58:47.667: E/AndroidRuntime(14860): at android.app.ActivityThread.main(ActivityThread.java:4507)
06-14 13:58:47.667: E/AndroidRuntime(14860): at java.lang.reflect.Method.invokeNative(Native Method)
06-14 13:58:47.667: E/AndroidRuntime(14860): at java.lang.reflect.Method.invoke(Method.java:511)
06-14 13:58:47.667: E/AndroidRuntime(14860): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
06-14 13:58:47.667: E/AndroidRuntime(14860): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
06-14 13:58:47.667: E/AndroidRuntime(14860): at dalvik.system.NativeStart.main(Native Method)
try this as in example, you were finding that expanded view inside your clicked view
final ImageView expandedImageView = (ImageView) findViewById(R.id.expanded_image);
expandedImageView.setImageResource(imageResId);
in zoomImageFromThumb(final View thumbView, int imageResId)
Or you may need to find that view in main fragment view like
final ImageView expandedImageView = (ImageView) mainView.findViewById(R.id.expanded_image);
expandedImageView.setImageResource(imageResId);
not in thumbView
.
EDIT:
Change your gridview.xml
as follows, put both views in same layout
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
<ImageView
android:id="@+id/expanded_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="invisible" />
you can use Relative layout wrapper for both so that one overlaps with other
and use
final ImageView expandedImageView = (ImageView) findViewById(R.id.expanded_image);
expandedImageView.setImageResource(imageResId);
in zoomImageFromThumb(final View thumbView, int imageResId)
if you get symbol not find findViewById()
error, then add
public static Activity getActivity(){
return this;
}
in GridViewActivity.java
and then use
final ImageView expandedImageView = (ImageView) GridViewActivity.getActivity().findViewById(R.id.expanded_image);
expandedImageView.setImageResource(imageResId);
in zoomImageFromThumb(final View thumbView, int imageResId)
这篇关于GridView的放大图片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!