当前位置:首页 » 安卓系统 » android3d滑动

android3d滑动

发布时间: 2023-05-22 07:23:06

① Android上这种布局和联动的滑动效果是怎么做到的

实现思路简介:viewpager是全屏的,所有页面共用的header,根据当前页面listview或者scrollview的滑动距离设置translationY;切换tab时,根据当前header的高度调整下一个tab页面的滚动距离。缺点:封面上有很多响应时,需要自己进行手势处理

给点提示:
MainActivity文件中代码:
package com.android.flip;

import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ViewFlipper;

/**
* Android实现左右滑动效果
* @Description: Android实现左右滑动效果

* @File: MainActivity.java

* @Package com.android.flip

* @Author Hanyonglu

* @Date 2012-02-12 上午10:44:04

* @Version V1.0
*/
public class MainActivity extends Activity implements OnGestureListener {
private ViewFlipper flipper;
private GestureDetector detector;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

detector = new GestureDetector(this);
flipper = (ViewFlipper) this.findViewById(R.id.ViewFlipper1);

flipper.addView(addImageView(R.drawable.one));
flipper.addView(addImageView(R.drawable.two));
flipper.addView(addImageView(R.drawable.three));
flipper.addView(addImageView(R.drawable.four));
flipper.addView(addImageView(R.drawable.five));
}

private View addImageView(int id) {
ImageView iv = new ImageView(this);
iv.setImageResource(id);
return iv;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return this.detector.onTouchEvent(event);
}

@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (e1.getX() - e2.getX() > 120) {
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
this.flipper.showNext();
return true;
} else if (e1.getX() - e2.getX() < -120) {
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
this.flipper.showPrevious();
return true;
}

return false;
}

@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub

}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
return false;
}

@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub

}

@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
}

② 哪些安卓 手机有3Dtouch功能。机型型号

苹果对于3DTOUCH是拥有着专利的存在,国产手机如果想要负载3DTOUCH的话是需要向apple公司付专利费的

现在国产手机以及应用APP的适配已经是很繁琐的过程了
之前的魅族Pro6就支持3DTOUCH的功能,但是厂商适配的软件少之又少,并且随着软件的更新,很多软件都会抛弃这个功能
而且其实3Dtouch使用频率也不是特别的高,也仅仅是个别程序可以适配
安卓手机厂商如果加上3DTOUCH功能的话,成本肯定也会随着增加
3D Touch功散铅能成本高,需要在屏幕下方再铺上一层感应面板。而安卓手机通常以性价比为卖点,像这种需要多余的成本但是没有什么实用价值的功能,是需要尽力避免避免的。

再者,安卓手机原本就有虚拟导航栏的设计,类似多任务切换这样的功能使用虚拟键就可以实现,用不着3D Touch。
其实安卓手机也可以通过优化系统来模拟iOS的3D Touch功能,比如现在很多手机都支持长按桌面APP,弹出快捷菜单,使用体验和iOS的3D Touch并没有太大的区别,也不会增加任何成本。只不过由于是系统模拟的,手感没有3D Touch那么好,功能也不够丰富。
3D Touch还有一个问题就是会导致机身变厚,进而让电池容量缩水。尤其是现在流行的玻璃机身原本就比过去冲腔好的金属机身更厚,如果再加入3D Touch功能的话,电池容量恐怕要下降不少,这对于功耗大、用电快的安卓手机来说是一个致圆颂命的威胁。

总之一句话,俗话说“一分钱一分货”,安卓手机大多价格便宜,肯定没有苹果手机那么丰富的功能。苹果手机卖的那么贵,在很多细节功能方面都比安卓手机做的更好一些。

③ android 怎么实现3d立方体滑屏效果

blur 就有啊

④ 在原生Android N系统上,3D Touch又会是怎样的姿势

目前安卓原生数乱还没上3D Touch,后续版举森本会加入,应该是7.0版本,其他目前国内品牌有魅族带有,但薯答档称不上普及

⑤ android开发中,怎么实现上下滑动,不是ScrollView,我要的是一次滑动整个页面,跟横向滑动效果一样。。

直接用intent跳转到下个页面啊 判断用户有向上滑动的手势 就跳转 然后设置一个 跳转的动画效果就可以了..

⑥ android开发,怎样实现一个台球的3D滚动球上的数字跟着转

用as3可以轻松实现

⑦ android 3Dgallery 点击事件

没明白你的意思,你设置切换activity怎么还有gallery

⑧ android可滑动收起展开布局

以前有个抽屉效果的类,可以实现这个效果。不过这个类后来被摒弃了。可以用SlidingPanelLayout.java试试,不过这个只能左右方向,不能上下方向。

⑨ 求助,怎么用android实现控件的3D立体旋转效果

  • 实现水平滑动,所以可在手势抬起的时候进行判断并处理,是滑动显得流畅,代码如下:

packagecom.example.rotation3dview;
importandroid.content.Context;
importandroid.graphics.Camera;
importandroid.graphics.Canvas;
importandroid.graphics.Matrix;
importandroid.util.AttributeSet;
importandroid.view.MotionEvent;
importandroid.view.VelocityTracker;
importandroid.view.View;
importandroid.view.ViewDebug.HierarchyTraceType;
importandroid.view.ViewGroup;
importandroid.widget.ImageView;
importandroid.widget.Scroller;

{
privateintmCurScreen=1;
//滑动的速度
privatestaticfinalintSNAP_VELOCITY=500;
;
privateintmWidth;
privateScrollermScroller;
privateCameramCamera;
privateMatrixmMatrix;
//旋转的角度,可以进行修改来观察效果
privatefloatangle=90;
publicRote3DView(Contextcontext,AttributeSetattrs){
super(context,attrs);
mScroller=newScroller(context);
mCamera=newCamera();
mMatrix=newMatrix();
initScreens();
}

publicvoidinitScreens(){
ViewGroup.LayoutParamsp=newViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
for(inti=0;i<3;i++){
this.addView(newImageView(this.getContext()),i,p);
}
((ImageView)this.getChildAt(0)).setImageResource(R.drawable.page1);
((ImageView)this.getChildAt(1)).setImageResource(R.drawable.page2);
((ImageView)this.getChildAt(2)).setImageResource(R.drawable.page3);
}

@Override
protectedvoidonLayout(booleanchanged,intl,intt,intr,intb){
intchildLeft=0;
finalintchildCount=getChildCount();
for(inti=0;i<childCount;i++){
finalViewchildView=getChildAt(i);
if(childView.getVisibility()!=View.GONE){
finalintchildWidth=childView.getMeasuredWidth();
childView.layout(childLeft,0,childLeft+childWidth,childView.getMeasuredHeight());
childLeft+=childWidth;
}
}
}

@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
finalintwidth=MeasureSpec.getSize(widthMeasureSpec);
finalintwidthMode=MeasureSpec.getMode(widthMeasureSpec);
if(widthMode!=MeasureSpec.EXACTLY){
thrownewIllegalStateException("仅支持精确尺寸");
}
finalintheightMode=MeasureSpec.getMode(heightMeasureSpec);
if(heightMode!=MeasureSpec.EXACTLY){
thrownewIllegalStateException("仅支持精确尺寸");
}
finalintcount=getChildCount();
for(inti=0;i<count;i++){
getChildAt(i).measure(widthMeasureSpec,heightMeasureSpec);
}
scrollTo(mCurScreen*width,0);
}

privatefloatmDownX;
@Override
publicbooleanonTouchEvent(MotionEventevent){
if(mVelocityTracker==null){
mVelocityTracker=VelocityTracker.obtain();
}
//将当前的触摸事件传递给VelocityTracker对象
mVelocityTracker.addMovement(event);
floatx=event.getX();
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
if(!mScroller.isFinished()){
mScroller.abortAnimation();
}
mDownX=x;
break;
caseMotionEvent.ACTION_MOVE:
intdisX=(int)(mDownX-x);
mDownX=x;
scrollBy(disX,0);
break;
caseMotionEvent.ACTION_UP:
=mVelocityTracker;
velocityTracker.computeCurrentVelocity(1000);
intvelocityX=(int)velocityTracker.getXVelocity();
if(velocityX>SNAP_VELOCITY&&mCurScreen>0){
snapToScreen(mCurScreen-1);
}elseif(velocityX<-SNAP_VELOCITY&&mCurScreen<getChildCount()-1){
snapToScreen(mCurScreen+1);
}else{
snapToDestination();
}
if(mVelocityTracker!=null){
mVelocityTracker.recycle();
mVelocityTracker=null;
}
break;
}
returntrue;
}

@Override
publicvoidcomputeScroll(){
if(mScroller.computeScrollOffset()){
scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
postInvalidate();
}
}

publicvoidsnapToDestination(){
setMWidth();
finalintdestScreen=(getScrollX()+mWidth/2)/mWidth;
snapToScreen(destScreen);
}

publicvoidsnapToScreen(intwhichScreen){
whichScreen=Math.max(0,Math.min(whichScreen,getChildCount()-1));
setMWidth();
intscrollX=getScrollX();
intstartWidth=whichScreen*mWidth;
if(scrollX!=startWidth){
intdelta=0;
intstartX=0;
if(whichScreen>mCurScreen){
setPre();
delta=startWidth-scrollX;
startX=mWidth-startWidth+scrollX;
}elseif(whichScreen<mCurScreen){
setNext();
delta=-scrollX;
startX=scrollX+mWidth;
}else{
startX=scrollX;
delta=startWidth-scrollX;
}
mScroller.startScroll(startX,0,delta,0,Math.abs(delta)*2);
invalidate();
}
}

privatevoidsetNext(){
intcount=this.getChildCount();
Viewview=getChildAt(count-1);
removeViewAt(count-1);
addView(view,0);
}

privatevoidsetPre(){
intcount=this.getChildCount();
Viewview=getChildAt(0);
removeViewAt(0);
addView(view,count-1);
}

privatevoidsetMWidth(){
if(mWidth==0){
mWidth=getWidth();
}
}
}
  • 实现立体效果,添加如下代码:

/*
*当进行View滑动时,会导致当前的View无效,该函数的作用是对View进行重新绘制调用drawScreen函数
*/
@Override
protectedvoiddispatchDraw(Canvascanvas){
finallongdrawingTime=getDrawingTime();
finalintcount=getChildCount();
for(inti=0;i<count;i++){
drawScreen(canvas,i,drawingTime);
}
}

publicvoiddrawScreen(Canvascanvas,intscreen,longdrawingTime){
//得到当前子View的宽度
finalintwidth=getWidth();
finalintscrollWidth=screen*width;
finalintscrollX=this.getScrollX();
//偏移量不足的时
if(scrollWidth>scrollX+width||scrollWidth+width<scrollX){
return;
}
finalViewchild=getChildAt(screen);
finalintfaceIndex=screen;
finalfloatcurrentDegree=getScrollX()*(angle/getMeasuredWidth());
finalfloatfaceDegree=currentDegree-faceIndex*angle;
if(faceDegree>90||faceDegree<-90){
return;
}
finalfloatcenterX=(scrollWidth<scrollX)?scrollWidth+width
:scrollWidth;
finalfloatcenterY=getHeight()/2;
finalCameracamera=mCamera;
finalMatrixmatrix=mMatrix;
canvas.save();
camera.save();
camera.rotateY(-faceDegree);
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX,-centerY);
matrix.postTranslate(centerX,centerY);
canvas.concat(matrix);
drawChild(canvas,child,drawingTime);
canvas.restore();
}
    热点内容
    什么是解压目录 发布:2025-02-12 22:49:24 浏览:979
    惠普电脑选购要考虑哪些因素配置 发布:2025-02-12 22:43:50 浏览:221
    算法导论和算法 发布:2025-02-12 22:43:13 浏览:930
    儿童电动车遥控如何配置 发布:2025-02-12 22:37:54 浏览:248
    crm客户关系管理源码 发布:2025-02-12 22:34:10 浏览:987
    c与java编译过程 发布:2025-02-12 21:47:47 浏览:374
    python的面向对象 发布:2025-02-12 21:46:10 浏览:614
    医学影像存储解决方案 发布:2025-02-12 21:45:58 浏览:977
    股票走势预测算法 发布:2025-02-12 21:45:06 浏览:769
    游戏lua脚本 发布:2025-02-12 21:45:01 浏览:919