日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Android 裸眼3D效果View控件

瀏覽:24日期:2023-12-08 14:11:31

描述:這是一個裸眼3D效果的控件View。Tips:本項目代碼部分邏輯參考于其他文章(自如的3D裸眼實現),眾人拾柴火焰高,希望大家能多多補充。

項目代碼:https://gitee.com/jiugeishere/uidesign

控件效果如下:

詳解Android 裸眼3D效果View控件

實現功能:

實現三層圖片疊加效果(裸眼3D效果) 可設置每層圖片移動速率 可設置每層圖片移動的限制度數 可直接設置圖片或引入圖片

設計核心:

主要的設計核心是依賴于傳感器對手機晃動的監聽(重力感應監聽器),對每層圖片進行不同的移動,實現仿3D效果。

核心代碼:

SensorLayout 用以監聽傳感器

import android.content.Context;import android.content.res.TypedArray;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.util.AttributeSet;import android.widget.FrameLayout;import android.widget.Scroller;import androidx.annotation.IntDef;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import com.ui.design.R;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*** 傳感器監聽* author tangxianfeng* created 2021.8.15**/public class SensorLayout extends FrameLayout implements SensorEventListener { private final SensorManager mSensorManager; private float[] mAccelerateValues; private float[] mMagneticValues; private final Scroller mScroller; private double mDegreeYMin = -50;//最小偏移度數 Y private double mDegreeYMax = 50;//最大偏移度數 Y private double mDegreeXMin = -50;//最小偏移度數 X private double mDegreeXMax = 50;//最大偏移度數 X private static final double MOVE_DISTANCE_X = 50;//X軸移動偏移量 實際偏移為MOVE_DISTANCE_X*acclerateratio private static final double MOVE_DISTANCE_Y = 50;//Y軸移動偏移量 實際偏移為MOVE_DISTANCE_Y*acclerateratio private float acclerateratio = 1;//偏移加速的倍率 可以通過設置此倍率改變偏移速度 private final float[] values = new float[3];//包含 x,y,z的偏移量 private final float[] Sensororientation = new float[9];//旋轉矩陣 public SensorLayout(@NonNull Context context) {this(context, null); } public SensorLayout(@NonNull Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0); } public SensorLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mScroller = new Scroller(context);if (attrs != null) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SensorLayoutStyle); acclerateratio = typedArray.getFloat(R.styleable.SensorLayoutStyle_AccelerateRatio, 1);}mSensorManager = (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);if (mSensorManager != null) { Sensor accelerateSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // 地磁場傳感器 Sensor magneticSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); mSensorManager.registerListener(this, accelerateSensor, SensorManager.SENSOR_DELAY_GAME); mSensorManager.registerListener(this, magneticSensor, SensorManager.SENSOR_DELAY_GAME);} } @Override public void onSensorChanged(SensorEvent event) {if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { mAccelerateValues = event.values;}if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { mMagneticValues = event.values;}if (mMagneticValues != null && mAccelerateValues != null) SensorManager.getRotationMatrix(Sensororientation, null, mAccelerateValues, mMagneticValues);SensorManager.getOrientation(Sensororientation, values);// x軸的偏轉角度double degreeX = (float) Math.toDegrees(values[1]);// y軸的偏轉角度double degreeY = (float) Math.toDegrees(values[2]);int scrollX = mScroller.getFinalX();int scrollY = mScroller.getFinalY();if (degreeY <= 0 && degreeY > mDegreeYMin) { scrollX = (int) (degreeY / Math.abs(mDegreeYMin) * MOVE_DISTANCE_X * acclerateratio);} else if (degreeY > 0 && degreeY < mDegreeYMax) { scrollX = (int) (degreeY / Math.abs(mDegreeYMax) * MOVE_DISTANCE_X * acclerateratio);}if (degreeX <= 0 && degreeX > mDegreeXMin) { scrollY = (int) (degreeX / Math.abs(mDegreeXMin) * MOVE_DISTANCE_Y * acclerateratio);} else if (degreeX > 0 && degreeX < mDegreeXMax) { scrollY = (int) (degreeX / Math.abs(mDegreeXMax) * MOVE_DISTANCE_Y * acclerateratio);}smoothScroll(scrollX, scrollY); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } //移動 public void smoothScroll(int destX, int destY) {int scrollY = getScrollY();int delta = destY - scrollY;mScroller.startScroll(destX, scrollY, 0, delta, 200);invalidate(); } @Override public void computeScroll() {if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate();} } //解綁監聽 public void unregister() {mSensorManager.unregisterListener(this); } public void setDegree(double degreeYMin,double degreeYMax,double degreeXMin,double degreeXMax) {mDegreeYMin = degreeYMin;mDegreeYMax=degreeYMax;degreeXMax=degreeYMax;degreeXMin=degreeXMin; } public void setAcclerateratio(float acclerateratio) {this.acclerateratio = acclerateratio; } @IntDef({DIRECTION_LEFT, DIRECTION_RIGHT}) @Retention(RetentionPolicy.SOURCE) @Target(ElementType.PARAMETER) public @interface ADirection { } public static final int DIRECTION_LEFT = 1; public static final int DIRECTION_RIGHT = -1;}

Sensor3DView 三層視圖封裝

import android.content.Context;import android.content.res.TypedArray;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.ImageView;import android.widget.LinearLayout;import androidx.annotation.Nullable;import com.bumptech.glide.Glide;import com.ui.design.R;/*** author tangxianfeng* created 2021.8.15**/public class Sensor3DView extends LinearLayout { private SensorLayout sensorforeground;//最上層傳感器View private SensorLayout sensorbackground;//最底層傳感器View private SensorLayout sensormid;//中間層傳感器View private ImageView foregroundimg;//最上層圖片 private ImageView backgroundimg;//底層圖片 private ImageView midimg;//中間層圖片 private Context mContext; public Sensor3DView(Context context) {super(context);this.mContext = context; } public Sensor3DView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);View inflate = LayoutInflater.from(getContext()).inflate(R.layout.sensor3d_item, this);this.mContext = context;initView(inflate);if (attrs != null) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Sensor3DViewStyle); float forgroundacclerateratio = typedArray.getFloat(R.styleable.Sensor3DViewStyle_foregroundAccelerateRatio, 1); float backgroundacclerateratio = typedArray.getFloat(R.styleable.Sensor3DViewStyle_backgroundAccelerateRatio, 1); float midacclerateratio = typedArray.getFloat(R.styleable.Sensor3DViewStyle_midAccelerateRatio, 1); setAllImg(typedArray.getResourceId(R.styleable.Sensor3DViewStyle_backgrounddrawable,1),typedArray.getResourceId(R.styleable.Sensor3DViewStyle_middrawable,1),typedArray.getResourceId(R.styleable.Sensor3DViewStyle_foregrounddrawable,1)); setAllratio(backgroundacclerateratio, midacclerateratio, forgroundacclerateratio);} } private void initView(View inflate) {sensorforeground = inflate.findViewById(R.id.sensorforeground);sensorbackground = inflate.findViewById(R.id.sensorbackground);sensormid = inflate.findViewById(R.id.sensormid);midimg = inflate.findViewById(R.id.midimg);backgroundimg = inflate.findViewById(R.id.backgroundimg);foregroundimg = inflate.findViewById(R.id.foregroundimg); } //加載三張圖片 public void setAllImg(Object backgroundurl, Object midurl, Object foregroundurl) {Glide.with(mContext).load(backgroundurl).into(backgroundimg);Glide.with(mContext).load(midurl).into(midimg);Glide.with(mContext).load(foregroundurl).into(foregroundimg); } //設置移動速度 public void setAllratio(float backgroundratio, float midratio, float foregroundratio) {sensorbackground.setAcclerateratio(backgroundratio);sensormid.setAcclerateratio(midratio);sensorforeground.setAcclerateratio(foregroundratio); } //設置限制角度 public void setDegree(float MinX,float MinY,float MaxX,float MaxY,View3DLayer layer){if (MinX>=MaxX||MinY>=MaxY){ return;}switch (layer){ case all:setDegree(MinY,MaxY,MinX,MaxX,sensorforeground);setDegree(MinY,MaxY,MinX,MaxX,sensormid);setDegree(MinY,MaxY,MinX,MaxX,sensorbackground);break; case mid:setDegree(MinY,MaxY,MinX,MaxX,sensormid);break; case background:setDegree(MinY,MaxY,MinX,MaxX,sensorbackground);break; case foreground:setDegree(MinY,MaxY,MinX,MaxX,sensorforeground);break;} } //sensorLayout 設置限制角度 private void setDegree(float MinY,float MaxY,float MinX,float MaxX,SensorLayout sensorLayout){sensorLayout.setDegree(MinY,MaxY,MinX,MaxX); } @Override public void destroyDrawingCache() {super.destroyDrawingCache();sensorbackground.unregister();sensormid.unregister();sensorforeground.unregister(); } public enum View3DLayer{foreground,background,mid,all }}

styles.xml

<!--3D裸眼效果--> <declare-styleable name='SensorLayoutStyle'><attr name='AccelerateRatio' format='float' /> </declare-styleable> <!--3D裸眼效果集合View--> <declare-styleable name='Sensor3DViewStyle'><attr name='foregroundAccelerateRatio' format='float' /><attr name='backgroundAccelerateRatio' format='float' /><attr name='midAccelerateRatio' format='float' /><attr name='foregrounddrawable' format='reference' /><attr name='backgrounddrawable' format='reference' /><attr name='middrawable' format='reference' /> </declare-styleable>

使用示例:

直接引用到layout文件中便可,或者可通過代碼設置其他屬性。

<com.ui.design.view.sensor3D.view.Sensor3DViewandroid: android:layout_width='match_parent'android:layout_height='200dp'android:layout_centerInParent='true'app:foregrounddrawable='@drawable/forground3d'app:backgrounddrawable='@drawable/background3d'app:middrawable='@drawable/mid3d'app:foregroundAccelerateRatio='4.0'app:backgroundAccelerateRatio='-2.0'app:midAccelerateRatio='1.0'/>

項目代碼倉庫 UIDesign 開源項目

到此這篇關于詳解Android 裸眼3D效果View控件的文章就介紹到這了,更多相關Android 裸眼3D效果內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本不卡中文字幕| 免费在线观看一区| 国产欧美亚洲一区| 99国产精品私拍| 国产亚洲福利| 日本精品久久| 久久福利一区| 日韩精品久久久久久久电影99爱 | 国产在线观看91一区二区三区| 在线观看亚洲精品福利片| 日韩理论片av| 亚洲第一区色| 日韩国产高清在线| 欧美天堂亚洲电影院在线观看| 国产精品对白| 日韩专区一卡二卡| 亚洲欧美日韩在线观看a三区 | 亚洲精品动态| 九九精品调教| 欧美久久久网站| 私拍精品福利视频在线一区| 日韩国产欧美三级| 国产欧美日韩一区二区三区在线| 欧美日韩一视频区二区| 麻豆高清免费国产一区| 91精品国产91久久久久久黑人| 久久亚洲一区| 精品一区二区三区中文字幕在线| 99久久精品网| 国产日韩欧美三区| 99精品综合| 日韩国产在线不卡视频| 日韩综合在线| 视频一区二区不卡| 国产高潮在线| 一本一道久久a久久| 国产伊人久久| 日韩在线卡一卡二| 精品一区二区三区亚洲| 视频一区中文| 国产精品4hu.www| 亚洲免费中文| 日韩av在线播放网址| 午夜亚洲福利| 亚洲91视频| 国产精品亚洲欧美日韩一区在线| 久久久蜜桃一区二区人| 欧美片第1页综合| 激情综合激情| 美日韩一区二区三区| 免费观看日韩电影| 日韩国产激情| 国产亚洲字幕| 亚洲精品一区二区在线看| 欧美日韩一区二区国产| 国产精品超碰| 午夜精品久久久久久久久久蜜桃| 91精品啪在线观看国产爱臀| 欧美激情在线精品一区二区三区| 麻豆成全视频免费观看在线看| 国产经典一区| 在线视频精品| 欧美经典一区| 激情久久五月| 老司机久久99久久精品播放免费| 亚洲二区视频| 色欧美自拍视频| 国产欧美另类| 蜜芽一区二区三区| 日韩av二区| 国产精品国产三级在线观看| 日本va欧美va欧美va精品| 久久亚洲欧美| 在线亚洲欧美| 欧美日韩视频| 99国产精品久久久久久久成人热| 日韩伦理一区| 九九99久久精品在免费线bt| 欧美日韩夜夜| 天堂va欧美ⅴa亚洲va一国产| 尹人成人综合网| 香蕉人人精品| 久久人人97超碰国产公开结果| 福利欧美精品在线| 国产精一区二区| 国产色99精品9i| 日本va欧美va欧美va精品| 在线精品观看| 亚洲精品极品| 日本不卡视频在线观看| 亚洲精品一级| 视频一区中文字幕精品| 亚洲人亚洲人色久| 日本va欧美va瓶| 亚洲精品第一| 日本欧美在线| 97久久中文字幕| 欧美天堂一区| 美女毛片一区二区三区四区最新中文字幕亚洲 | 国产精品美女久久久浪潮软件| 欧美特黄一级大片| 四虎影视精品| 亚洲黄页一区| 亚洲人成网站在线在线观看| 日本在线观看不卡视频| 久久精品超碰| 麻豆成人av在线| 免费污视频在线一区| 精精国产xxxx视频在线野外| 久久亚洲在线| 中文国产一区| 亚洲a级精品| 国产精品sm| 久久久久久久欧美精品| 精品资源在线| 亚洲午夜一级| 日韩欧美中文字幕一区二区三区| 国产区精品区| 久久久久网站| 中文字幕一区二区三区四区久久 | 在线精品国产亚洲| 国产精品视频一区二区三区综合 | 欧美日韩1区2区3区| 精品国产成人| 蜜臀久久99精品久久一区二区 | 美美哒免费高清在线观看视频一区二区| 日韩精品久久久久久| 欧美激情99| 亚洲先锋成人| 欧美视频久久| 精品捆绑调教一区二区三区| 欧美精品九九| 国产剧情一区二区在线观看| 日韩久久电影| 蜜臀久久99精品久久久久久9| 国产精品videossex久久发布| 国产精品一二| 一区二区三区四区日韩| 国产亚洲欧美日韩在线观看一区二区| 免费人成网站在线观看欧美高清| 国产精品成人一区二区不卡| 国产精品啊啊啊| 国产在线看片免费视频在线观看| 亚洲精品无播放器在线播放| 日韩精品第一| 久久亚洲黄色| 欧洲av不卡| 亚洲欧美久久久| 国产精品白浆| 美女尤物久久精品| 国产一区二区三区四区大秀| 日韩电影在线视频| 亚洲三级国产| 久久精品官网| 国产精品主播| 99国产精品| av日韩中文| 日韩精品国产精品| 日韩中文首页| 国产精品一区二区三区av麻| 国产亚洲高清视频| 卡一卡二国产精品| 日韩精品一级| 午夜在线精品| 播放一区二区| 精品国产欧美| 日欧美一区二区| 欧美特黄一区| 波多视频一区| 国产调教精品| 亚洲精品免费观看| 国产亚洲高清视频| 亚洲精品一区三区三区在线观看| 7777精品| 亚洲涩涩av| 亚洲激情精品| 久久久久网站| 荡女精品导航| 国产极品嫩模在线观看91精品| 中文字幕av一区二区三区四区| 91精品一区二区三区综合在线爱 | av高清不卡| 欧美黑人做爰爽爽爽| 日韩精品中文字幕一区二区| 99热精品在线观看| 日韩不卡在线| 福利视频一区| 麻豆视频一区| 国产精品一区二区三区美女 | 麻豆视频一区二区| 日韩精品高清不卡| 丝袜美腿高跟呻吟高潮一区| 国产91精品对白在线播放| 精品一区视频| 欧美a在线观看| 国产精品一区二区三区av麻| 日韩精品视频网| 亚洲一区二区三区四区电影| 99久精品视频在线观看视频| 香蕉视频亚洲一级|