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

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

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

瀏覽:25日期: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久久,三上悠亚国产精品一区二区三区
久久尤物视频| 日本久久精品| 九九久久电影| 亚洲尤物在线| 中文字幕免费精品| 日精品一区二区三区| 日本一区二区三区中文字幕| 日韩精品1区2区3区| 欧美精品中文| 国产成人久久| 午夜日韩福利| 深夜日韩欧美| www在线观看黄色| 亚洲免费高清| 青青草精品视频| 美女视频网站久久| 国产一区欧美| 日韩综合小视频| 九九99久久精品在免费线bt| 高潮一区二区| 欧美不卡视频| 91看片一区| 亚洲视频二区| 狠狠久久伊人中文字幕| 亚洲国产专区| 青青伊人久久| 在线日韩中文| 久久国内精品视频| 国产一区二区三区亚洲综合| 99精品视频精品精品视频| 亚洲国产日韩欧美在线| 亚洲精品一级二级三级| 国产视频网站一区二区三区| 成人在线网站| 麻豆高清免费国产一区| 日韩影院二区| 日韩成人精品一区二区三区 | 国产字幕视频一区二区| 国产日产精品一区二区三区四区的观看方式| 嫩呦国产一区二区三区av| 欧美日韩国产传媒| 免费日韩成人| 国产精品美女在线观看直播| 国产毛片久久| 亚洲黑丝一区二区| 日韩av一级| 久久国产免费看| 美美哒免费高清在线观看视频一区二区| 久久精品伊人| 精品一区二区三区中文字幕| 日韩不卡一区二区| 中文字幕日韩亚洲| 免播放器亚洲| 亚洲一区二区免费看| 五月综合激情| 久久都是精品| 亚洲一区二区三区高清| 日韩视频免费| 视频一区欧美精品| 黄色精品网站| 亚洲婷婷丁香| 免费一区二区视频| 亚洲三级精品| 91综合久久爱com| 国产极品久久久久久久久波多结野| 婷婷综合国产| 日韩久久99| 捆绑调教美女网站视频一区| 麻豆国产精品777777在线| 成人国产精品久久| 亚洲精品一级二级| 999久久久亚洲| 久久亚洲精品伦理| 国产精区一区二区| 国产福利片在线观看| 91tv亚洲精品香蕉国产一区| 亚洲成av人片一区二区密柚| 国模 一区 二区 三区| 亚洲一区二区三区免费在线观看| 欧美综合二区| 精品亚洲成人| 性欧美69xoxoxoxo| 亚久久调教视频| 欧美韩日一区| 久久国产88| 麻豆成人91精品二区三区| 999久久久国产精品| 亚洲精品一级二级三级| 精品国产中文字幕第一页| 蜜桃视频欧美| 日韩av二区在线播放| 精品美女久久| 蜜桃视频一区二区三区| 麻豆精品99| 日韩精品一级中文字幕精品视频免费观看 | 国产精品久久久久av蜜臀| 精品美女在线视频| 亚洲人成网77777色在线播放| 欧美黑人做爰爽爽爽| 午夜欧美精品久久久久久久| 日韩精品一级| 99视频一区| 乱一区二区av| 日本不卡视频一二三区| 亚洲福利精品| 久久不卡国产精品一区二区| 国产精品毛片一区二区三区| 久久亚洲国产精品尤物| 一区二区日韩免费看| 亚洲第一区色| 国产精品久久久久蜜臀| 国产欧美自拍| 日韩一区二区三区精品| 日韩视频久久| 亚洲精品.com| 成人午夜毛片| 麻豆高清免费国产一区| 国产欧美高清| 国产日韩亚洲| 日本视频在线一区| 天堂av一区| 日韩av三区| 日韩精品成人| 日本免费在线视频不卡一不卡二| 综合一区在线| 日本少妇一区二区| 国产精品亚洲欧美| 国产精品探花在线观看| 欧美亚洲二区| 国产精品久久久久久妇女| 亚洲日韩中文字幕一区| 日韩一区网站| 久久99蜜桃| 国产91在线播放精品| 97精品97| 亚洲高清成人| 亚洲日韩视频| 欧美亚洲色图校园春色| 久久精品国产999大香线蕉| 精品国产日韩欧美精品国产欧美日韩一区二区三区| 国产日韩三级| 久久久久亚洲| 亚洲涩涩av| 精品国产一区二区三区噜噜噜| 在线手机中文字幕| 久久视频精品| 日韩一区中文| 精品一区二区三区免费看| 性欧美xxxx免费岛国不卡电影| 尤物在线精品| 国产精品一区二区精品| 欧美三区四区| 最近国产精品视频| 久久久久久亚洲精品美女| av综合电影网站| 国产亚洲福利| 欧美激情网址| 亚洲欧美日韩一区在线观看| 国产精品一区二区精品视频观看 | 欧美激情视频一区二区三区免费 | 国产一区二区三区国产精品| 成人羞羞视频在线看网址| 欧美aa在线观看| 日韩国产成人精品| 精品一区二区三区中文字幕| 99精品电影| 麻豆一区在线| 亚洲精品中文字幕99999| 免费一级欧美在线观看视频| 午夜精品婷婷| 日韩国产激情| 国产区精品区| 免费成人在线视频观看| 日韩国产专区| 美女久久久久久| 91欧美极品| 婷婷亚洲精品| 欧美日韩在线二区| 韩日一区二区| 久久wwww| 国产极品一区| 国产免费av一区二区三区| 综合一区av| 中文字幕av一区二区三区四区| 美女网站一区| 亚洲国产一区二区三区在线播放| 青青青免费在线视频| 国产精品视频一区二区三区综合| 亚洲精品少妇| 日本久久一区| 91精品国产自产观看在线| 亚洲伊人精品酒店| 先锋影音久久久| 丝袜美腿亚洲一区二区图片| 五月天久久777| 视频在线观看91| 日韩高清在线一区| 国产精品手机在线播放| 精品香蕉视频| 亚洲v在线看|