Gallery平滑移动

2024-05-14 19:58
文章标签 移动 平滑 gallery

本文主要是介绍Gallery平滑移动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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();
        
        
    }

}


另外一种

@SuppressWarnings("deprecation")
public void onJumpPage(int id) {

cur = gally.getSelectedItemPosition();

MotionEvent e1 = MotionEvent.obtain(
   SystemClock.uptimeMillis(),
   SystemClock.uptimeMillis()+30,  
   MotionEvent.ACTION_DOWN, 
   (float)screenWidth-30,//89.333336f,
   (float)screenHeight-30,//265.33334f, 
   0);



MotionEvent e2 = MotionEvent.obtain(
   SystemClock.uptimeMillis(),
   SystemClock.uptimeMillis()+30,
   MotionEvent.ACTION_UP, 
   (float)screenWidth-30,//300.0f, 
   (float)screenHeight-30,//screenHeight/2 - 100,//238.00003f, 
   0);

if(id < cur){
gally.onFling(e1, e2, screenWidth,
0);
LogWrapper.i("tempvalue","rightMove");
}else if(id > cur){
gally.onFling(e1, e2, -screenWidth,
0);
LogWrapper.i("tempvalue","leftMove");
}
//*/
gally.setSelection(id);


这篇关于Gallery平滑移动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/989709

相关文章

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Golang服务平滑重启

与重载配置相同的是我们也需要通过信号来通知server重启,但关键在于平滑重启,如果只是简单的重启,只需要kill掉,然后再拉起即可。平滑重启意味着server升级的时候可以不用停止业务。 我们先来看下Github上有没有相应的库解决这个问题,然后找到了如下三个库: facebookgo/grace - Graceful restart & zero downtime deploy for G

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体(FromBorderStyle=none时),这时候你会发现拖动窗体的功能就没有了,这里需要自己构建方法让用户可以拖动整个窗体,这里我们使用前辈的