public class FlipViewFragment extends Fragment {
public static final String ARG_ITEM_ID = "FlipViewFragment";
public static Boolean autoplay = false;
FlipViewController flipView = null;
Context mContext;
public Boolean autoplaycompleted = false;
ImageView imageDetail;
Matrix matrix = new Matrix();
float scale = 1f;
ScaleGestureDetector SGD;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.container_flipview,
container, false);
imageDetail = (ImageView) rootView.findViewById(R.id.imageView1);
imageDetail.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
SGD.onTouchEvent(motionEvent);
return true;
}
});
return ViewFlipViewLayout();
// return rootView;
}
public View ViewFlipViewLayout() {
ArrayList<Integer> images = new ArrayList<Integer>();
images.add(R.drawable.image1);
images.add(R.drawable.image2);
images.add(R.drawable.image3);
// You can also use FlipViewController.VERTICAL
flipView = new FlipViewController(getActivity(),
FlipViewController.HORIZONTAL);
// We're creating a NoteViewAdapter instance, by passing in the current
// context and the
// values to display after each flip
flipView.setAdapter(new ImageViewAdapter(getActivity(), images));
// flipView.onInterceptTouchEvent(MotionEvent event);
// setContentView(flipView);
return flipView;
}
public void AutoPlayAlbum() {
// Toast.makeText(getApplicationContext(), "Service Running",
// Toast.LENGTH_LONG).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (autoplay) {
if (flipView.autoFlip()) {
AutoPlayAlbum();
} else {
Context mContext = MainActivity.mContext;
((MainActivity) mContext).btnAutoPlay
.setBackgroundResource(android.R.drawable.ic_media_play);
autoplay = false;
((MainActivity) mContext).mPlayer.pause();
((MainActivity) mContext).length = ((MainActivity) mContext).mPlayer
.getCurrentPosition();
((MainActivity) mContext).btnSound
.setBackgroundResource(android.R.drawable.ic_lock_silent_mode);
autoplaycompleted = true;
}
}
}
}, 6000);
}
public void restartAutoPlay() {
Log.e("Restart", "true");
// flipView.restartFlip(getActivity(), FlipViewController.HORIZONTAL);
// Reload current fragment
Fragment frg = null;
frg = getFragmentManager().findFragmentByTag(ARG_ITEM_ID);
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();
}
private void GarbageCollector() {
System.gc();
Runtime.getRuntime().gc();
}
public class ImageViewAdapter extends BaseAdapter {
ImageView imgView;
Bitmap bitmap;
int bmpWidth, bmpHeight;
// Touch event related variables
int touchState;
final int IDLE = 0;
final int TOUCH = 1;
final int PINCH = 2;
float dist0, distCurrent;
private LayoutInflater inflater;
private ArrayList<Integer> images;
public ImageViewAdapter(Context currentContext,
ArrayList<Integer> allImages) {
inflater = LayoutInflater.from(currentContext);
images = allImages;
}
@Override
public int getCount() {
return images.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View layout = convertView;
GarbageCollector();
if (convertView == null) {
layout = inflater.inflate(R.layout.container_flipview, null);
}
// Get's value from our ArrayList by the position
Integer image = images.get(position);
imgView = (ImageView) layout.findViewById(R.id.imageView1);
// imgView.setText(note);
// imgView.setImageResource(image);
bitmap = BitmapFactory.decodeResource(getResources(), image);
bmpWidth = bitmap.getWidth();
bmpHeight = bitmap.getHeight();
distCurrent = 1; // Dummy default distance
dist0 = 1; // Dummy default distance
imgView.setImageBitmap(bitmap);
imgView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
return false;
}
});
// imgView.setOnTouchListener(new OnTouchListener() {
//
// @Override
// public boolean onTouch(View view, MotionEvent motionEvent) {
// SGD.onTouchEvent(motionEvent);
// return true;
// }
// });
/*
* Context mContext = MainActivity.mContext; RelativeLayout
* container = (RelativeLayout) ((MainActivity) mContext)
* .findViewById(R.id.content_container); container.bringToFront();
*/
return layout;
}
}
}
我希望在触摸图像时为图像视图添加放大和缩小。翻转后图像应该达到默认大小。从一个图像翻转到另一个图像后,它必须恢复到原始大小
答案 0 :(得分:0)
试试这段代码
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.ImageView;
public class ZoomableImageView extends ImageView
{
Matrix matrix = new Matrix();
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
static final int CLICK = 3;
int mode = NONE;
PointF last = new PointF();
PointF start = new PointF();
float minScale = 1f;
float maxScale = 4f;
float[] m;
float redundantXSpace, redundantYSpace;
float width, height;
float saveScale = 1f;
float right, bottom, origWidth, origHeight, bmWidth, bmHeight;
ScaleGestureDetector mScaleDetector;
Context context;
public ZoomableImageView(Context context, AttributeSet attr)
{
super(context, attr);
super.setClickable(true);
this.context = context;
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
matrix.setTranslate(1f, 1f);
m = new float[9];
setImageMatrix(matrix);
setScaleType(ScaleType.MATRIX);
setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
mScaleDetector.onTouchEvent(event);
matrix.getValues(m);
float x = m[Matrix.MTRANS_X];
float y = m[Matrix.MTRANS_Y];
PointF curr = new PointF(event.getX(), event.getY());
switch (event.getAction())
{
//when one finger is touching
//set the mode to DRAG
case MotionEvent.ACTION_DOWN:
last.set(event.getX(), event.getY());
start.set(last);
mode = DRAG;
break;
//when two fingers are touching
//set the mode to ZOOM
case MotionEvent.ACTION_POINTER_DOWN:
last.set(event.getX(), event.getY());
start.set(last);
mode = ZOOM;
break;
//when a finger moves
//If mode is applicable move image
case MotionEvent.ACTION_MOVE:
//if the mode is ZOOM or
//if the mode is DRAG and already zoomed
if (mode == ZOOM || (mode == DRAG && saveScale > minScale))
{
float deltaX = curr.x - last.x;// x difference
float deltaY = curr.y - last.y;// y difference
float scaleWidth = Math.round(origWidth * saveScale);// width after applying current scale
float scaleHeight = Math.round(origHeight * saveScale);// height after applying current scale
//if scaleWidth is smaller than the views width
//in other words if the image width fits in the view
//limit left and right movement
if (scaleWidth < width)
{
deltaX = 0;
if (y + deltaY > 0)
deltaY = -y;
else if (y + deltaY < -bottom)
deltaY = -(y + bottom);
}
//if scaleHeight is smaller than the views height
//in other words if the image height fits in the view
//limit up and down movement
else if (scaleHeight < height)
{
deltaY = 0;
if (x + deltaX > 0)
deltaX = -x;
else if (x + deltaX < -right)
deltaX = -(x + right);
}
//if the image doesnt fit in the width or height
//limit both up and down and left and right
else
{
if (x + deltaX > 0)
deltaX = -x;
else if (x + deltaX < -right)
deltaX = -(x + right);
if (y + deltaY > 0)
deltaY = -y;
else if (y + deltaY < -bottom)
deltaY = -(y + bottom);
}
//move the image with the matrix
matrix.postTranslate(deltaX, deltaY);
//set the last touch location to the current
last.set(curr.x, curr.y);
}
break;
//first finger is lifted
case MotionEvent.ACTION_UP:
mode = NONE;
int xDiff = (int) Math.abs(curr.x - start.x);
int yDiff = (int) Math.abs(curr.y - start.y);
if (xDiff < CLICK && yDiff < CLICK)
performClick();
break;
// second finger is lifted
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
}
setImageMatrix(matrix);
invalidate();
return true;
}
});
}
@Override
public void setImageBitmap(Bitmap bm)
{
super.setImageBitmap(bm);
bmWidth = bm.getWidth();
bmHeight = bm.getHeight();
}
public void setMaxZoom(float x)
{
maxScale = x;
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener
{
@Override
public boolean onScaleBegin(ScaleGestureDetector detector)
{
mode = ZOOM;
return true;
}
@Override
public boolean onScale(ScaleGestureDetector detector)
{
float mScaleFactor = detector.getScaleFactor();
float origScale = saveScale;
saveScale *= mScaleFactor;
if (saveScale > maxScale)
{
saveScale = maxScale;
mScaleFactor = maxScale / origScale;
}
else if (saveScale < minScale)
{
saveScale = minScale;
mScaleFactor = minScale / origScale;
}
right = width * saveScale - width - (2 * redundantXSpace * saveScale);
bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
if (origWidth * saveScale <= width || origHeight * saveScale <= height)
{
matrix.postScale(mScaleFactor, mScaleFactor, width / 2, height / 2);
if (mScaleFactor < 1)
{
matrix.getValues(m);
float x = m[Matrix.MTRANS_X];
float y = m[Matrix.MTRANS_Y];
if (mScaleFactor < 1)
{
if (Math.round(origWidth * saveScale) < width)
{
if (y < -bottom)
matrix.postTranslate(0, -(y + bottom));
else if (y > 0)
matrix.postTranslate(0, -y);
}
else
{
if (x < -right)
matrix.postTranslate(-(x + right), 0);
else if (x > 0)
matrix.postTranslate(-x, 0);
}
}
}
}
else
{
matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY());
matrix.getValues(m);
float x = m[Matrix.MTRANS_X];
float y = m[Matrix.MTRANS_Y];
if (mScaleFactor < 1) {
if (x < -right)
matrix.postTranslate(-(x + right), 0);
else if (x > 0)
matrix.postTranslate(-x, 0);
if (y < -bottom)
matrix.postTranslate(0, -(y + bottom));
else if (y > 0)
matrix.postTranslate(0, -y);
}
}
return true;
}
}
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = MeasureSpec.getSize(widthMeasureSpec);
height = MeasureSpec.getSize(heightMeasureSpec);
//Fit to screen.
float scale;
float scaleX = width / bmWidth;
float scaleY = height / bmHeight;
scale = Math.min(scaleX, scaleY);
matrix.setScale(scale, scale);
setImageMatrix(matrix);
saveScale = 1f;
// Center the image
redundantYSpace = height - (scale * bmHeight) ;
redundantXSpace = width - (scale * bmWidth);
redundantYSpace /= 2;
redundantXSpace /= 2;
matrix.postTranslate(redundantXSpace, redundantYSpace);
origWidth = width - 2 * redundantXSpace;
origHeight = height - 2 * redundantYSpace;
right = width * saveScale - width - (2 * redundantXSpace * saveScale);
bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
setImageMatrix(matrix);
}
}