看了些网上的方法弄了下平滑移动的效果,虽说最后是实现了,实现后发现也不是我想要的效果,对于我幸苦写过的代码先存放在这上面了

package com.layout;

import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.animation.Transformation;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Scroller;

public class GalleryFlow extends Gallery{

private Camera mCamera = new Camera();
    private int mMaxRotationAngle = 60;
    private int mMaxZoom = -300;
    private int mCoveflowCenter;
    
    //test
    private Scroller mScroller;
    private int mTouchSlop;
    private int mMinimumVelocitx;
    private int mMaximumVelocitx;
    private VelocityTracker mVelocityTracker;
    private float mLastMotionX;
    private boolean mIsInEdge = false;
    private Context context;
    
    public GalleryFlow(Context context) {
        super(context);
        this.context = context;
        this.setStaticTransformationsEnabled(true);
    }
    public GalleryFlow(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.setStaticTransformationsEnabled(true);
        this.context = context;
        init(context);
    }

public void init(Context context) {
        mScroller = new Scroller(context);
        setFocusable(true);
        setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
        setWillNotDraw(false);
        final ViewConfiguration configuration = ViewConfiguration.get(context);
        mTouchSlop = configuration.getScaledTouchSlop();
        mMinimumVelocitx = configuration.getScaledMinimumFlingVelocity();
        mMaximumVelocitx = configuration.getScaledMaximumFlingVelocity();
    }

public void fling(int velocityX) {
            if (getChildCount() > 0) {
                    mScroller.fling(getScrollX(), getScrollY(), velocityX, 0, 0, 20, 0,
                                    0);
                    final boolean movingDown = velocityX > 0;
                    awakenScrollBars(mScroller.getDuration());
                    invalidate();
            }
    }

private void obtainVelocityTracker(MotionEvent event) {
            if (mVelocityTracker == null) {
                    mVelocityTracker = VelocityTracker.obtain();
            }
            mVelocityTracker.addMovement(event);
    }

private void releaseVelocityTracker() {
            if (mVelocityTracker != null) {
                    mVelocityTracker.recycle();
                    mVelocityTracker = null;
            }
    }

@Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        if (event.getAction() == MotionEvent.ACTION_DOWN
                && event.getEdgeFlags() != 0) {
            return false;
        }

obtainVelocityTracker(event);

final int action = event.getAction();
        final float x = event.getX();
        final float y = event.getY();

switch (action) {
        case MotionEvent.ACTION_DOWN:
            if (!mScroller.isFinished()) {
                mScroller.abortAnimation();
            }
            mLastMotionX = x;
            break;

case MotionEvent.ACTION_MOVE:
            final int deltaX = (int) (mLastMotionX - x);
            mLastMotionX = x;
            if (deltaX < 0) {
                if (getScrollX() > 0) {
//                    scrollBy(0,deltaX);
                    scrollBy(deltaX,0);
                }
        }else if(deltaX > 0) {
                int childTotalWidth = 0;
                int width = 0;
                if(getChildAt(0) != null){
                   width = getChildAt(0).getWidth();
                }
                for (int i = 0; i < getChildCount(); i++) {
                    childTotalWidth += this.getChildAt(i).getWidth();
                }
                mIsInEdge = getScrollX() <= childTotalWidth - 20;//width
                if (mIsInEdge) {
//                    scrollBy(0, deltaX);
                    scrollBy(deltaX, 0);
                }
            }
            break;

case MotionEvent.ACTION_UP:
            final VelocityTracker velocityTracker = mVelocityTracker;
            velocityTracker.computeCurrentVelocity(1000, mMaximumVelocitx);
            int initialVelocity = (int) velocityTracker.getYVelocity();

if ((Math.abs(initialVelocity) > mMinimumVelocitx)
                    && getChildCount() > 0) {
                fling(-initialVelocity);
            }

releaseVelocityTracker();
            break;
        }

return true;

}

public void computeScroll() {
            if (mScroller.computeScrollOffset()) {
                    int scrollX = getScrollX();
                    int scrollY = getScrollY();
                    int oldX = scrollX;
                    int oldY = scrollY;
                    int x = mScroller.getCurrX();
                    int y = mScroller.getCurrY();
                    scrollX = x ;
                    scrollX = scrollX + 10;
                    scrollY = y;
//                    scrollY = scrollY + 10;
                    scrollTo(scrollX, scrollY);
                    postInvalidate();
            }
    }
    @Override
    public int getChildCount() {
        // TODO Auto-generated method stub
        return super.getChildCount();
    }

public int getMaxRotationAngle() {
        return mMaxRotationAngle;
    }
    public void setMaxRotationAngle(int maxRotationAngle) {
        mMaxRotationAngle = maxRotationAngle;
    }
    public int getMaxZoom() {
        return mMaxZoom;
    }
    public void setMaxZoom(int maxZoom) {
        mMaxZoom = maxZoom;
    }
    private int getCenterOfCoverflow() {
        return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2
                        + getPaddingLeft();
    }
    private static int getCenterOfView(View view) {
        System.out.println("view left :"+view.getLeft());
        System.out.println("view width :"+view.getWidth());
        return view.getLeft() + view.getWidth() / 2;
        
    }
   
   
    @Override
    protected boolean getChildStaticTransformation(View child, Transformation t) {
        /*/
         final int childCenter = getCenterOfView(child);
         final int childWidth = child.getWidth();
         int rotationAngle = 0;

t.clear();
         t.setTransformationType(Transformation.TYPE_MATRIX);

if (childCenter == mCoveflowCenter) {
                 transformImageBitmap((LinearLayout) child, t, 0);
         } else {
                 rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);
                 if (Math.abs(rotationAngle) > mMaxRotationAngle) {
                         rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle
                                         : mMaxRotationAngle;
                 }
                 transformImageBitmap((LinearLayout) child, t, rotationAngle);
         }
         //*/
        return true;
    }
    
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        mCoveflowCenter = getCenterOfCoverflow();
        super.onSizeChanged(w, h, oldw, oldh);
    }
    
    private void transformImageBitmap(LinearLayout child, Transformation t,
                    int rotationAngle) {
        mCamera.save();
        final Matrix imageMatrix = t.getMatrix();
        final int imageHeight = child.getLayoutParams().height;
        final int imageWidth = child.getLayoutParams().width;
       
        final int rotation = Math.abs(rotationAngle);
       
        mCamera.translate(0.0f, 0.0f, 100.0f);
        if (rotation < mMaxRotationAngle) {
            float zoomAmount = (float) (mMaxZoom + (rotation * 1));//1.5
            mCamera.translate(0.0f, 0.0f, 0);
        }
        mCamera.rotateY(rotationAngle);
        mCamera.getMatrix(imageMatrix);
        imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));
        imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));
        mCamera.restore();
        
        
    }

}

Gallery平滑移动的更多相关文章

  1. S Gallery – 很有特色的响应式 jQuery 相册插件

    S Gallery 是一款响应式的 jQuery 相册插件.使用了 HTML5 全屏 API 以及 CSS3 动画 和 CSS3 转换,所以只能在支持这些功能的浏览器中使用. 这款插件它有一个特色功能 ...

  2. 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版

    背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...

  3. 使用图片视频展示插件blueimp Gallery改造网站的视频图片展示

    在很多情况下,我们网站可能会展示我们的产品图片.以及教程视频等内容,结合一个比较好的图片.视频展示插件,能够使得我们的站点更加方便使用,也更加酷炫,在Github上有很多相关的处理插件可以找来使用,有 ...

  4. Nginx在线服务状态下平滑升级或新增模块的详细操作

    今天应开发的需求,需要在Nginx增加一个模块,并不能影响现有的业务,所以就必须要平滑升级Nginx,好了,不多说了 1:查看现有的nginx编译参数 /usr/local/nginx/sbin/ng ...

  5. yarn关于app max attempt深度解析,针对长服务appmaster平滑重启

    在YARN上开发长服务,需要注意fault-tolerance,本篇文章对appmaster的平滑重启的一个参数做了解析,如何设置可以有助于达到appmaster平滑重启. 在yarn-site.xm ...

  6. 备忘-Android ViewPager 与Gallery滑动冲突解决方法

    解决方法,重新定义gallery,禁止触发pager的触摸事件 1 public class UserGallery extends Gallery implements OnGestureListe ...

  7. 让你的网站免费支持 HTTPS 及 Nginx 平滑升级

    为什么要使用 HTTPS ? 首先来说一下 HTTP 与 HTTPS 协议的区别吧,他们的根本区别就是 HTTPS 在 HTTP 协议的基础上加入了 SSL 层,在传输层对网络连接进行加密.简单点说在 ...

  8. [修正] 移动平台曲线不平滑的问题(如:TRectangle, TPath...等)

    问题:从 XE4 以来,Firemonkey 曲线绘图在移动平台不平滑的问题一直令人诟病,提交到官方的 QC 也是族繁不及备载,官方似乎有意的避开这个问题,迟迟没有修正. 适用版本:XE4 ~ Ber ...

  9. jQuery实现页面内锚点平滑跳转

    平时我们做导航滚动到内容都是通过锚点来做,刷的一下就直接跳到内容了,没有一丝的滚动效果,而且 url 链接最后会有“小尾巴”,就像#keleyi,今天我就介绍一款 jquery 做的滚动的特效,既可以 ...

随机推荐

  1. HttpServletRequest 报错 myeclipese支持tomcat

    做WEB项目的时候,别人拷贝了一份源码给你导入myeclipse结果发现一堆报错 HttpServletRequest  一排红色波浪线..... 这个原因主要是没有tomcat下的一个jar包 se ...

  2. mongo设计(二)

    原文:http://blog.mongodb.org/post/87892923503/6-rules-of-thumb-for-mongodb-schema-design-part-2 By Wil ...

  3. Oracle EBS-SQL (WIP-13):检查任务组件未选MRP净值.sql

    select WE.WIP_ENTITY_NAME                                              任务号,         MFG_LOOKUPS_WJS. ...

  4. 10-2[RF] OOB validation

    main idea: 在使用bootstrap生成gi的训练集时,会有一部分数据没有被选中,使用这一部分数据(OOB)进行validation. 1.数据没有被选中的概率 假设训练集大小为N,使用bo ...

  5. php 多维数组 arrayList array()

    <pre name="code" class="php">$params=array( "tid"=>"3&qu ...

  6. 在magento中发邮件

    1. 在system->Configuration->Store Email Addresses中设置General Contact的Sender Name.Sender Email. S ...

  7. Egret初体验–躲避类小游戏

    下面简单介绍一下我这个游戏:基本上就3个画面(准备再添加一个胜利的界面)开始画面,一个按钮,点击进入游戏游戏画面,滚动的背景,触摸移动的老鹰,从天而降的翔,以及右上角的时间条结束画面,显示结果,关注按 ...

  8. 第9课_2_dbsoft安装

    三 安装Oracle Database 数据库软件 1.上传数据库安装包到虚拟机上,unzip命令解压database软件,赋予正确的权限和属主,在以oracle身份登录进行图形界面安装 unzip ...

  9. VB.NET函数——数学函数/字母串函数

    一.数学函数 函数 说明 Abs (num) 取绝对值. Exp (num) 返回以e为底.以num为指数的值,如Exp(2)返回e^2值. Log (num) 返回参数num的自然对数值,为Doub ...

  10. VC/MFC使用OLE操作 EXCEL

    1.VC插入sheet页到指定位置 插入sheet的函数用 sheets.Add(Before, After,Count,Type) 四个参数含义如下: 四个const   VARIANT:      ...