當前位置:首頁 » 安卓系統 » 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();
}
    熱點內容
    eclipse查看jar包源碼 發布:2025-02-12 23:59:35 瀏覽:972
    電腦主機伺服器維修 發布:2025-02-12 23:59:26 瀏覽:301
    sqlserver標識 發布:2025-02-12 23:51:33 瀏覽:463
    安卓怎麼玩地牢獵人 發布:2025-02-12 23:50:25 瀏覽:943
    思鄉腳本 發布:2025-02-12 23:43:32 瀏覽:439
    java的job 發布:2025-02-12 23:38:43 瀏覽:893
    我的世界伺服器授權指令 發布:2025-02-12 23:30:13 瀏覽:596
    電腦伺服器號在哪裡找 發布:2025-02-12 23:22:29 瀏覽:12
    linux查看系統是32位 發布:2025-02-12 23:17:29 瀏覽:989
    從資料庫中隨機取資料庫數據 發布:2025-02-12 23:17:25 瀏覽:878