package com.android.photostore;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.view.animation.Transformation;
import android.view.animation.Animation.AnimationListener;
import android.widget.Adapter;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
// TODO:
// 1. In order to improve performance Cache screen bitmap and use for animation
// 2. Establish superfluous memory allocations and delay or replace with reused objects
// Probably need to make sure we are not allocating objects (strings, etc.) in loops
public class FlingGallery extends FrameLayout
{
// Constants
private final int swipe_min_distance = 120;
private final int swipe_max_off_path = 250;
private final int swipe_threshold_veloicty = 400;
// Properties
private int mViewPaddingWidth = 0;
private int mAnimationDuration = 250;
private float mSnapBorderRatio = 0.5f;
//true为循环显示,false为非循环显示
private boolean mIsGalleryCircular = false;
// Members
private int mGalleryWidth = 0;
private boolean mIsTouched = false;
private boolean mIsDragging = false;
private float mCurrentOffset = 0.0f;
private long mScrollTimestamp = 0;
private int mFlingDirection = 0;
private int mCurrentPosition = 0;
private int mCurrentViewNumber = 0;
private int reloadViewNumber = 0;
private int reloadPosition = 0;
private Context mContext;
private Adapter mAdapter;
private FlingGalleryView[] mViews;
private FlingGalleryAnimation mAnimation;
private GestureDetector mGestureDetector;
private Interpolator mDecelerateInterpolater;
private boolean canTouch = true;
private ImageSwitcher mImageSwitcher;
public void setCanTouch(boolean canTouch) {
this.canTouch = canTouch;
}
public FlingGallery(Context context) {
this(context, null);
}
public FlingGallery(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public FlingGallery(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mImageSwitcher = (ImageSwitcher)context;
mContext = context;
mAdapter = null;
mViews = new FlingGalleryView[3];
mViews[0] = new FlingGalleryView(0, this);
mViews[1] = new FlingGalleryView(1, this);
mViews[2] = new FlingGalleryView(2, this);
mAnimation = new FlingGalleryAnimation();
mAnimation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
});
mGestureDetector = new GestureDetector(new FlingGestureDetector());
mDecelerateInterpolater = AnimationUtils.loadInterpolator(mContext, android.R.anim.decelerate_interpolator);
}
public void setPaddingWidth(int viewPaddingWidth)
{
mViewPaddingWidth = viewPaddingWidth;
}
public void setAnimationDuration(int animationDuration)
{
mAnimationDuration = animationDuration;
}
public void setSnapBorderRatio(float snapBorderRatio)
{
mSnapBorderRatio = snapBorderRatio;
}
public void setIsGalleryCircular(boolean isGalleryCircular)
{
if (mIsGalleryCircular != isGalleryCircular)
{
mIsGalleryCircular = isGalleryCircular;
if (mCurrentPosition == getFirstPosition())
{
// We need to reload the view immediately to the left to change it to circular view or blank
mViews[getPrevViewNumber(mCurrentViewNumber)].recycleView(getPrevPosition(mCurrentPosition));
}
if (mCurrentPosition == getLastPosition())
{
// We need to reload the view immediately to the right to change it to circular view or blank
mViews[getNextViewNumber(mCurrentViewNumber)].recycleView(getNextPosition(mCurrentPosition));
}
}
}
public int getGalleryCount()
{
return (mAdapter == null) ? 0 : mAdapter.getCount();
}
public int getFirstPosition()
{
return 0;
}
public int getLastPosition()
{
return (getGalleryCount() == 0) ? 0 : getGalleryCount() - 1;
}
private int getPrevPosition(int relativePosition)
{
int prevPosition = relativePosition - 1;
if (prevPosition < getFirstPosition())
{
prevPosition = getFirstPosition() - 1;
if (mIsGalleryCircular == true)
{
prevPosition = getLastPosition();
}
}
return prevPosition;
}
private int getNextPosition(int relativePosition)
{
int nextPosition = relativePosition + 1;
if (nextPosition > getLastPosition())
{
nextPosition = getLastPosition() + 1;
if (mIsGalleryCircular == true)
{
nextPosition = getFirstPosition();
}
}
return nextPosition;
}
private int getPrevViewNumber(int relativeViewNumber)
{
return (relativeViewNumber == 0) ? 2 : relativeViewNumber - 1;
}
private int getNextViewNumber(int relativeViewNumber)
{
return (relativeViewNumber == 2) ? 0 : relativeViewNumber + 1;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
{
super.onLayout(changed, left, top, right, bottom);
// Calculate our view width
mGalleryWidth = right - left;
if (changed == true)
{
// Position views at correct starting offsets
mViews[0].setOffset(0, 0, mCurrentViewNumber);
mViews[1].setOffset(0, 0, mCurrentViewNumber);
mViews[2].setOffset(0, 0, mCurrentViewNumber);
}
}
public void setAdapter(Adapter adapter,int index)
{
mAdapter = adapter;
mCurrentPosition = index;
mCurrentViewNumber = 0;
// Load the initial views from adapter
mViews[0].recycleView(mCurrentPosition);
mViews[1].recycleView(getNextPosition(mCurrentPosition));
mViews[2].recycleView(getPrevPosition(mCurrentPosition));
// Position views at correct starting offsets
mViews[0].setOffset(0, 0, mCurrentViewNumber);
mViews[1].setOffset(0, 0, mCurrentViewNumber);
mViews[2].setOffset(0, 0, mCurrentViewNumber);
mImageSwitcher.goneTempImage();
}
private int getViewOffset(int viewNumber, int relativeViewNumber)
{
// Determine width including configured padding width
int offsetWidth = mGalleryWidth + mViewPaddingWidth;
// Position the previous view one measured width to left
if (viewNumber == getPrevViewNumber(relativeViewNumber))
{
return offsetWidth;
}
// Position the next view one measured width to the right
if (viewNumber == getNextViewNumber(relativeViewNumber))
{
return offsetWidth * -1;
}
return 0;
}
void movePrevious()
{
// Slide to previous view
mFlingDirection = 1;
processGesture();
}
void moveNext()
{
// Slide to next view
mFlingDirection = -1;
processGesture();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_LEFT:
movePrevious();
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT:
moveNext();
return true;
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return onGalleryTouchEvent(event);
}
private boolean onGalleryTouchEvent(MotionEvent event)
{
if(canTouch){
boolean consumed =
没有合适的资源?快使用搜索试试~ 我知道了~
小程序 PhotoStore图片浏览器源码.rar
共123个文件
class:41个
png:27个
xml:25个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 80 浏览量
2023-02-03
11:39:19
上传
评论
收藏 878KB RAR 举报
温馨提示
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请举报或通知本人删除。
资源推荐
资源详情
资源评论
收起资源包目录
小程序 PhotoStore图片浏览器源码.rar (123个子文件)
all-wcprops 424B
all-wcprops 424B
all-wcprops 295B
resources.ap_ 76KB
PhotoStore2.apk 120KB
FlingGallery.class 10KB
ImageSwitcher.class 8KB
GridImageView.class 6KB
ListFolder.class 5KB
Gallery.class 4KB
FlingGallery$FlingGestureDetector.class 4KB
FlingGallery$FlingGalleryView.class 3KB
ImageZoomView.class 3KB
GridImageView$2.class 3KB
Constant.class 3KB
FlingGallery$FlingGalleryAnimation.class 3KB
GridImageView$1.class 3KB
Gallery$1.class 3KB
SimpleZoomListener.class 2KB
ListFolder$1.class 2KB
FlingGallery$FlingGalleryView$2.class 2KB
FlingGallery$FlingGalleryView$1.class 2KB
GridImageView$3.class 2KB
Gallery$1$1.class 2KB
ImageSwitcher$1.class 1KB
ImageSwitcher$GalleryViewItem.class 1KB
SimpleZoomListener$ControlType.class 1KB
ZoomState.class 1KB
R$drawable.class 1KB
FlingGallery$1.class 1KB
ListFolder$ScanThread.class 1KB
ThreadPoolUtil.class 1KB
ImageSwitcher$MyGestureListener.class 1008B
Gallery$ScanThread.class 996B
R$id.class 892B
R$layout.class 811B
ThreadPoolUtil$1.class 785B
Constant$1.class 743B
Constant$ImageFolderInfo.class 712B
R.class 661B
Constant$gridItemEntity.class 570B
R$anim.class 524B
R$string.class 439B
R$color.class 423B
R$attr.class 352B
UIinterface.class 205B
.classpath 357B
classes.dex 87KB
entries 544B
entries 544B
entries 502B
FlingGallery.java 20KB
ImageSwitcher.java 7KB
GridImageView.java 7KB
ImageZoomView.java 5KB
ZoomState.java 4KB
Gallery.java 4KB
SimpleZoomListener.java 4KB
R.java 4KB
ListFolder.java 4KB
Constant.java 2KB
ThreadPoolUtil.java 1KB
UIinterface.java 439B
bk2.jpg 13KB
1_120925104041_4.png 188KB
1_120925104041_1.png 137KB
1_120925104041_3.png 110KB
1_120925104041_2.png 88KB
icon.png 5KB
serach.png 4KB
icon.png 3KB
icon.png 3KB
icon.png 3KB
usbhost.png 3KB
pressed_application_background.9.png 2KB
intenal.png 2KB
focused_application_background.9.png 2KB
start.png 2KB
rotate.png 2KB
setupfor.png 1KB
pause.png 1KB
rotateright.png 1KB
sdcard.png 1KB
rotateleft.png 1KB
details.png 1KB
rotate2.png 1KB
backto.png 1KB
switchfor.png 1KB
intenal_bk.png 1KB
delete.png 1KB
thumb.png 953B
.project 846B
default.properties 364B
strings.xml.svn-base 3KB
strings.xml.svn-base 3KB
arrays.xml.svn-base 793B
arrays.xml.svn-base 793B
bright_text_dark_focused.xml.svn-base 562B
image_view.xml 3KB
myhorizontalview.xml 2KB
共 123 条
- 1
- 2
资源评论
大富大贵7
- 粉丝: 319
- 资源: 8869
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功