Привет, я использую виджет галереи, чтобы показывать изображения, загруженные из Интернета.Android Gallery увеличить/уменьшить
, чтобы показать несколько изображений, и я хотел бы иметь постепенный зум, пока люди скользят вверх и вниз по экрану. Я знаю, как реализовать сенсорное событие, единственное, что я не знаю, как сделать просмотр всей галереи постепенно. Я не хочу увеличивать изображение на одном изображении. Я хочу, чтобы вся галерея постепенно увеличивала/уменьшала масштаб.
EDIT3: Мне удается увеличить видимую часть галереи, но проблема в том, что мне нужно найти способ, чтобы галерея узнала об этом и обновила его и других детей.
Что происходит, если 3 изображения видны, тогда вы начинаете масштабирование, и галерея становится меньше, поэтому изображения, а не то, что Я хотел бы в этом случае больше изображений быть видимыми, но я не знаю, как для достижения желаемого эффекта. Вот весь код:
public class Gallery1 extends Activity implements OnTouchListener {
private static final String TAG = "GalleryTest";
private float zoom=0.0f;
// Remember some things for zooming
PointF start = new PointF();
PointF mid = new PointF();
Gallery g;
LinearLayout layout2;
private ImageAdapter ad;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gallery_1);
layout2=(LinearLayout) findViewById(R.id.layout2);
// Reference the Gallery view
g = (Gallery) findViewById(R.id.gallery);
// Set the adapter to our custom adapter (below)
ad=new ImageAdapter(this);
g.setAdapter(ad);
layout2.setOnTouchListener(this);
}
public void zoomList(boolean increase) {
Log.i(TAG, "startig animation");
AnimatorSet set = new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(g, "scaleX", zoom),
ObjectAnimator.ofFloat(g, "scaleY", zoom)
);
set.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
// TODO Auto-generated method stub
}
});
set.setDuration(100).start();
}
public class ImageAdapter extends BaseAdapter {
private static final int ITEM_WIDTH = 136;
private static final int ITEM_HEIGHT = 88;
private final int mGalleryItemBackground;
private final Context mContext;
private final Integer[] mImageIds = {
R.drawable.gallery_photo_1,
R.drawable.gallery_photo_2,
R.drawable.gallery_photo_3,
R.drawable.gallery_photo_4,
R.drawable.gallery_photo_5,
R.drawable.gallery_photo_6,
R.drawable.gallery_photo_7,
R.drawable.gallery_photo_8
};
private final float mDensity;
public ImageAdapter(Context c) {
mContext = c;
// See res/values/attrs.xml for the <declare-styleable> that defines
// Gallery1.
TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
mGalleryItemBackground = a.getResourceId(
R.styleable.Gallery1_android_galleryItemBackground, 1);
a.recycle();
mDensity = c.getResources().getDisplayMetrics().density;
}
public int getCount() {
return mImageIds.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
convertView = new ImageView(mContext);
imageView = (ImageView) convertView;
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new Gallery.LayoutParams(
(int) (ITEM_WIDTH * mDensity + 0.5f),
(int) (ITEM_HEIGHT * mDensity + 0.5f)));
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mImageIds[position]);
return imageView;
}
}
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE
&& event.getPointerCount() > 1) {
midPoint(mid, event);
if(mid.y > start.y){
Log.i(TAG, "Going down (Math.abs(mid.y - start.y)= "+(Math.abs(mid.y - start.y))+" and zoom="+zoom); // going down so increase
if ((Math.abs(mid.y - start.y) > 10) && (zoom<2.5f)){
zoom=zoom+0.1f;
midPoint(start, event);
zoomList(true);
}
return true;
}else if(mid.y < start.y){
Log.i(TAG, "Going up (Math.abs(mid.y - start.y)= "+(Math.abs(mid.y - start.y))+" and zoom="+zoom); //smaller
if ((Math.abs(mid.y - start.y) > 10) &&(zoom>0.1)){
midPoint(start, event);
zoom=zoom-0.1f;
zoomList(false);
}
return true;
}
}
else if (event.getAction() == MotionEvent.ACTION_POINTER_DOWN) {
Log.e(TAG, "Pointer went down: " + event.getPointerCount());
return true;
}
else if (event.getAction() == MotionEvent.ACTION_UP) {
Log.i(TAG, "Pointer going up");
return true;
}
else if (event.getAction() == MotionEvent.ACTION_DOWN) {
Log.i(TAG, "Pointer going down");
start.set(event.getX(), event.getY());
return true;
}
return false;
// indicate event was handled or not
}
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x/2, y/2);
}
Я понимаю, что, возможно, придется расширить галерею или даже другой вид группы или создать свой собственный класс, но я не знаю, с чего начать: какой метод использовать один отвечает за масштабирование ...
EDIT4: Я не знаю, насколько он достаточно ясен. Ниже приведен пример состояний:
государство один: начальное состояние, у нас есть 3 изображения в поле зрения
Состояние 2: мы обнаруживаем вертикальные штрихи, идущие с 2-мя пальцами = мы должны уменьшить
состояние 3: мы начинаем масштабирование = анимация в галерее или на детях ???
состояние 4: галерея обнаруживает, что это 3-х детей меньше
состояние 5: галерея добавляет 1/больше детей в соответствии с новым свободного пространства
последнее обновление: Спасибо всем, что выложили, но я , наконец, пришли к выводу, и это не использовать галерею на всех: 1. это не рекомендуется 2. это не достаточно настраиваемый для моего случая
Если вы хотите, чтобы оживить несколько изображений сразу вы можете рассмотреть возможность использования OpenGL , Я использую libgdx библиотека: https://github.com/libgdx/libgdx
благодарит Akos за ваш ответ. Я пробовал это, но поскольку я использую анимацию в галерее, результат такой же, как и раньше: видимые - это schrinks, но не отображаются новые виды.Если я применил анимацию только к одному представлению, которое будет отображаться, и это только увеличивает масштаб. Если я использую scaleX/scaleY то же самое .... Я решил создать свой собственный Surfaceview и просто нарисовать растровые изображения – vallllll
Здравствуйте, Можете ли вы пройти здесь полный код, пожалуйста. – Hasmukh
Пожалуйста, введите полный код здесь ... Мне нужно срочно ... Спасибо заранее! –