看图心动没??

下面我们来看看代码吧,干货时间到;

1.项目结构
2.第一步新建一个calss,就起名叫Mi吧。一会用来绘制自定义View。
第二部在xml文件中放置插件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/black"tools:context=".MainActivity"><com.example.sersortest.Miandroid:id="@+id/miui"android:layout_centerInParent="true"android:layout_gravity="center"android:background="@color/black"android:layout_width="match_parent"android:layout_height="wrap_content"/>
</LinearLayout>

第三步写调用方向传感器的代码

package com.example.sersortest;import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;public class MainActivity extends AppCompatActivity {private SensorManager sensorManager;private SensorEventListener sensorEventListener;private Mi miui;private  float val;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);miui =findViewById(R.id.miui);sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);sensorEventListener = new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {val = event.values[0];miui.setVal(val);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}};sensorManager.registerListener(sensorEventListener,sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_GAME);}@Overrideprotected void onDestroy() {super.onDestroy();sensorManager.unregisterListener(sensorEventListener);}}

最后颜色样式colors.xml的文件给你们。

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="colorPrimary">#3F51B5</color><color name="colorPrimaryDark">#303F9F</color><color name="colorAccent">#FF4081</color><color name="black">#000</color><color name="darkRed">#702216</color><color name="lightGray">#323232</color><color name="deepGray">#8B8B8B</color><color name="white">#fff</color><color name="red">#f00</color><color name="ocbg">#237EAD</color>
</resources>

最后核心自定义View ,Mi.java的代码

package com.example.sersortest;import android.animation.PropertyValuesHolder;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Camera;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RadialGradient;
import android.graphics.Rect;
import android.graphics.Shader;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;public class Mi extends View {private Canvas mCanvas;private Context mContext;//View矩形的宽度private int width;//指南针圆心点坐标private int mCenterX;private int mCenterY;//外圆半径private int mOutSideRadius;//外接圆半径private int mCircumRadius;//指南针文字大小空间高度private int mTextHeight;//暗红色 外圈笔private Paint mDarkRedPaint;//深灰 外圈笔private Paint mDeepGrayPaint;//外三角笔private Paint mOutSideCircumPaint;//浅灰 外圈笔private Paint mLightGrayPaint;//指南针上面 文字笔private Paint mTextPaint;//外接圆,三角形笔private Paint mCircumPaint;//指南针上面文字的外接矩形,用来测文字大小让文字居中private Rect mTextRect;//外圈小三角形的Pathprivate Path mOutsideTriangle;//外接圆小三角形的Pathprivate Path mCircumTriangle;//NESW 文字笔 和文字外接矩形private Paint mNorthPaint;private Paint mOthersPaint;private Rect  mPositionRect;//小刻度文字大小矩形和画笔private Paint mSamllDegreePaint;//两位数的private Rect mSencondRect;//三位数的private Rect mThirdRect;//圆心数字矩形private Rect mCenterTextRect;//中心文字笔private Paint mCenterPaint;//内心圆是一个颜色辐射渐变的圆private Shader mInnerShader;private Paint mInnerPaint;//定义个点击属性动画private ValueAnimator mValueAnimator;// camera绕X轴旋转的角度private float mCameraRotateX;// camera绕Y轴旋转的角度private float mCameraRotateY;//camera最大旋转角度private float mMaxCameraRotate = 10;// camera绕X轴旋转的角度private float mCameraTranslateX;// camera绕Y轴旋转的角度private float mCameraTranslateY;//camera最大旋转角度private float mMaxCameraTranslate;//camera矩阵private Matrix mCameraMatrix;//设置cameraprivate Camera mCamera;private float val=0f;private float valCompare;//偏转角度红线笔private Paint mAnglePaint;//方位文字private String text="北";public float getVal() {return val;}public void setVal(float val) {this.val = val;invalidate();}public Mi(Context context) {this(context,null);}public Mi(Context context, @Nullable AttributeSet attrs) {this(context, attrs,0);}public Mi(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mContext = context;mDarkRedPaint = new Paint();mDarkRedPaint.setStyle(Paint.Style.STROKE);mDarkRedPaint.setAntiAlias(true);mDarkRedPaint.setColor(context.getResources().getColor(R.color.darkRed));mDeepGrayPaint = new Paint();mDeepGrayPaint.setStyle(Paint.Style.STROKE);mDeepGrayPaint.setAntiAlias(true);mDeepGrayPaint.setColor(context.getResources().getColor(R.color.deepGray));mLightGrayPaint = new Paint();mLightGrayPaint.setStyle(Paint.Style.FILL);mLightGrayPaint.setAntiAlias(true);mLightGrayPaint.setColor(context.getResources().getColor(R.color.lightGray));mTextPaint = new Paint();mTextPaint.setStyle(Paint.Style.STROKE);mTextPaint.setAntiAlias(true);mTextPaint.setTextSize(80);mTextPaint.setColor(context.getResources().getColor(R.color.white));mCircumPaint = new Paint();mCircumPaint.setStyle(Paint.Style.FILL);mCircumPaint.setAntiAlias(true);mCircumPaint.setColor(context.getResources().getColor(R.color.red));mOutSideCircumPaint = new Paint();mOutSideCircumPaint.setStyle(Paint.Style.FILL);mOutSideCircumPaint.setAntiAlias(true);mOutSideCircumPaint.setColor(context.getResources().getColor(R.color.lightGray));mTextRect = new Rect();mOutsideTriangle = new Path();mCircumTriangle = new Path();mNorthPaint = new Paint();mNorthPaint.setStyle(Paint.Style.STROKE);mNorthPaint.setAntiAlias(true);mNorthPaint.setTextSize(40);mNorthPaint.setColor(context.getResources().getColor(R.color.red));mOthersPaint = new Paint();mOthersPaint.setStyle(Paint.Style.STROKE);mOthersPaint.setAntiAlias(true);mOthersPaint.setTextSize(40);mOthersPaint.setColor(context.getResources().getColor(R.color.white));mPositionRect = new Rect();mCenterTextRect = new Rect();mCenterPaint = new Paint();mCenterPaint.setStyle(Paint.Style.STROKE);mCenterPaint.setAntiAlias(true);mCenterPaint.setTextSize(120);mCenterPaint.setColor(context.getResources().getColor(R.color.white));mSamllDegreePaint = new Paint();mSamllDegreePaint.setStyle(Paint.Style.STROKE);mSamllDegreePaint.setAntiAlias(true);mSamllDegreePaint.setTextSize(30);mSamllDegreePaint.setColor(context.getResources().getColor(R.color.lightGray));mSencondRect = new Rect();mThirdRect = new Rect();mInnerPaint = new Paint();mInnerPaint.setStyle(Paint.Style.FILL);mInnerPaint.setAntiAlias(true);mAnglePaint = new Paint();mAnglePaint.setStyle(Paint.Style.STROKE);mAnglePaint.setAntiAlias(true);mAnglePaint.setColor(context.getResources().getColor(R.color.red));mCameraMatrix = new Matrix();mCamera = new Camera();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mCanvas = canvas;//设置Camera矩阵 实现3D效果set3DMetrix();//画文字drawText();//画指南针外圈drawCompassOutSide();//画指南针外接圆drawCompassCircum();//画内部渐变颜色圆drawInnerCricle();//画指南针内部刻度drawCompassDegreeScale();//画圆心数字drawCenterText();}/*** 设置camera相关*/private void set3DMetrix() {mCameraMatrix.reset();mCamera.save();mCamera.rotateX(mCameraRotateX);mCamera.rotateY(mCameraRotateY);mCamera.getMatrix(mCameraMatrix);mCamera.restore();//camera默认旋转是View左上角为旋转中心//所以动作之前要,设置矩阵位置 -mTextHeight-mOutSideRadiusmCameraMatrix.preTranslate(-getWidth()/2,-getHeight()/2);//动作之后恢复位置mCameraMatrix.postTranslate(getWidth()/2,getHeight()/2);mCanvas.concat(mCameraMatrix);}private void drawInnerCricle() {mInnerShader = new RadialGradient(width/2,mOutSideRadius+mTextHeight,mCircumRadius-40, Color.parseColor("#323232"),Color.parseColor("#000000"),Shader.TileMode.CLAMP);mInnerPaint.setShader(mInnerShader);mCanvas.drawCircle(width/2,mOutSideRadius+mTextHeight,mCircumRadius-40,mInnerPaint);}private void drawCenterText() {String centerText=String.valueOf((int) val+"°");mCenterPaint.getTextBounds(centerText,0,centerText.length(),mCenterTextRect);int centerTextWidth = mCenterTextRect.width();int centerTextHeight = mCenterTextRect.height();mCanvas.drawText(centerText,width/2-centerTextWidth/2,mTextHeight+mOutSideRadius+centerTextHeight/5,mCenterPaint);}private void drawCompassDegreeScale() {mCanvas.save();//获取N文字的宽度mNorthPaint.getTextBounds("N",0,1,mPositionRect);int mPositionTextWidth = mPositionRect.width();int mPositionTextHeight = mPositionRect.height();//获取W文字宽度,因为W比较宽 所以要单独获取mNorthPaint.getTextBounds("W",0,1,mPositionRect);int mWPositionTextWidth = mPositionRect.width();int mWPositionTextHeight = mPositionRect.height();//获取小刻度,两位数的宽度mSamllDegreePaint.getTextBounds("30",0,1,mSencondRect);int mSencondTextWidth = mSencondRect.width();int mSencondTextHeight = mSencondRect.height();//获取小刻度,3位数的宽度mSamllDegreePaint.getTextBounds("30",0,1,mThirdRect);int mThirdTextWidth = mThirdRect.width();int mThirdTextHeight = mThirdRect.height();mCanvas.rotate(-val,width/2,mOutSideRadius+mTextHeight);//画刻度线for (int i = 0; i < 240; i++) {if (i==0||i==60||i==120||i==180){mCanvas.drawLine(getWidth() / 2, mTextHeight+mOutSideRadius-mCircumRadius+10,getWidth() / 2,  mTextHeight+mOutSideRadius-mCircumRadius+30, mDeepGrayPaint);}else{mCanvas.drawLine(getWidth() / 2, mTextHeight+mOutSideRadius-mCircumRadius+10,getWidth() / 2,  mTextHeight+mOutSideRadius-mCircumRadius+30, mLightGrayPaint);}if (i==0){mCanvas.drawText("N", this.width /2-mPositionTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mPositionTextHeight,mNorthPaint);}else if (i==60){mCanvas.drawText("E", this.width /2-mPositionTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mPositionTextHeight,mOthersPaint);}else if (i==120){mCanvas.drawText("S", this.width /2-mPositionTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mPositionTextHeight,mOthersPaint);}else if (i==180){mCanvas.drawText("W", this.width /2-mWPositionTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mWPositionTextHeight,mOthersPaint);}else if (i==20){mCanvas.drawText("30", this.width /2-mSencondTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mSencondTextHeight,mSamllDegreePaint);}else if (i==40){mCanvas.drawText("60", this.width /2-mSencondTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mSencondTextHeight,mSamllDegreePaint);}else if (i==80){mCanvas.drawText("120", this.width /2-mThirdTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mThirdTextHeight,mSamllDegreePaint);}else if (i==100){mCanvas.drawText("150", this.width /2-mThirdTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mThirdTextHeight,mSamllDegreePaint);}else if (i==140){mCanvas.drawText("210", this.width /2-mThirdTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mThirdTextHeight,mSamllDegreePaint);}else if (i==160){mCanvas.drawText("240", this.width /2-mThirdTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mThirdTextHeight,mSamllDegreePaint);}else if (i==200){mCanvas.drawText("300", this.width /2-mThirdTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mThirdTextHeight,mSamllDegreePaint);}else if (i==220){mCanvas.drawText("330", this.width /2-mThirdTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mThirdTextHeight,mSamllDegreePaint);}mCanvas.rotate(1.5f, mCenterX, mOutSideRadius+mTextHeight);}mCanvas.restore();}/*** 指南针外接圆,和外部圆换道理差不多*/private void drawCompassCircum() {mCanvas.save();//外接圆小三角形的高度int mTriangleHeight=(mOutSideRadius-mCircumRadius)/2;mCanvas.rotate(-val,width/2,mOutSideRadius+mTextHeight);mCircumTriangle.moveTo(width/2,mTriangleHeight+mTextHeight);//内接三角形的边长,简单数学运算float mTriangleSide = (float) ((mTriangleHeight/(Math.sqrt(3)))*2);mCircumTriangle.lineTo(width/2-mTriangleSide/2,mTextHeight+mTriangleHeight*2);mCircumTriangle.lineTo(width/2+mTriangleSide/2,mTextHeight+mTriangleHeight*2);mCircumTriangle.close();mCanvas.drawPath(mCircumTriangle,mCircumPaint);mCanvas.drawArc(width/2-mCircumRadius,mTextHeight+mOutSideRadius-mCircumRadius,width/2+mCircumRadius,mTextHeight+mOutSideRadius+mCircumRadius,-85,350,false,mDeepGrayPaint);mAnglePaint.setStrokeWidth(5f);if (val<=180){valCompare = val;mCanvas.drawArc(width/2-mCircumRadius,mTextHeight+mOutSideRadius-mCircumRadius,width/2+mCircumRadius,mTextHeight+mOutSideRadius+mCircumRadius,-85,valCompare,false,mAnglePaint);}else{valCompare = 360-val;mCanvas.drawArc(width/2-mCircumRadius,mTextHeight+mOutSideRadius-mCircumRadius,width/2+mCircumRadius,mTextHeight+mOutSideRadius+mCircumRadius,-95,-valCompare,false,mAnglePaint);}mCanvas.restore();}/*** 指南针外部可简单分为两部分* 1、用Path实现小三角形* 2、两个圆弧*/private void drawCompassOutSide() {mCanvas.save();//小三角形的高度int mTriangleHeight=40;//定义Path画小三角形mOutsideTriangle.moveTo(width/2,mTextHeight-mTriangleHeight);//小三角形的边长float mTriangleSide = 46.18f;//画出小三角形mOutsideTriangle.lineTo(width/2-mTriangleSide/2,mTextHeight);mOutsideTriangle.lineTo(width/2+mTriangleSide/2,mTextHeight);mOutsideTriangle.close();mCanvas.drawPath(mOutsideTriangle,mOutSideCircumPaint);//画圆弧mDarkRedPaint.setStrokeWidth((float) 5);mLightGrayPaint.setStrokeWidth((float)5);mDeepGrayPaint.setStrokeWidth((float)3);mLightGrayPaint.setStyle(Paint.Style.STROKE);mCanvas.drawArc(width/2-mOutSideRadius,mTextHeight,width/2+mOutSideRadius,mTextHeight+mOutSideRadius*2,-80,120,false,mLightGrayPaint);mCanvas.drawArc(width/2-mOutSideRadius,mTextHeight,width/2+mOutSideRadius,mTextHeight+mOutSideRadius*2,40,20,false,mDeepGrayPaint);mCanvas.drawArc(width/2-mOutSideRadius,mTextHeight,width/2+mOutSideRadius,mTextHeight+mOutSideRadius*2,-100,-20,false,mLightGrayPaint);mCanvas.drawArc(width/2-mOutSideRadius,mTextHeight,width/2+mOutSideRadius,mTextHeight+mOutSideRadius*2,-120,-120,false,mDarkRedPaint);mCanvas.restore();}private void drawText() {if (val<=15||val>=345){text = "北";}else if (val>15&&val<=75){text= "东北";}else if (val>75&&val<=105){text= "东";}else if (val>105&&val<=165){text="东南";}else if (val>165&&val<=195){text = "南";}else if (val>195&&val<=255){text = "西南";}else if (val>255&&val<=285){text = "西";}else if (val>285&&val<345){text="西北";}mTextPaint.getTextBounds(text,0,text.length(),mTextRect);//文字宽度int mTextWidth = mTextRect.width();//让文字水平居中显示mCanvas.drawText(text,width/2-mTextWidth/2,mTextHeight/2,mTextPaint);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);super.onMeasure(widthMeasureSpec, heightMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);width = Math.min(widthSize, heightSize);if (widthMode == MeasureSpec.UNSPECIFIED) {width = heightSize;} else if (heightMode == MeasureSpec.UNSPECIFIED) {width = widthSize;}//为指南针上面的文字预留空间,定为1/3边张mTextHeight = width/3;//设置圆心点坐标mCenterX = width/2;mCenterY = width/2+mTextHeight;//外部圆的外径mOutSideRadius = width*3/8;//外接圆的半径mCircumRadius = mOutSideRadius*4/5;//camera最大平移距离mMaxCameraTranslate = 0.02f*mOutSideRadius;setMeasuredDimension(width, width+width/3 );}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()){case MotionEvent.ACTION_DOWN:if (mValueAnimator!=null&&mValueAnimator.isRunning()){mValueAnimator.cancel();}//3D 效果让Camera旋转,获取旋转偏移大小getCameraRotate(event);//获取平移大小getCameraTranslate(event);break;case MotionEvent.ACTION_MOVE://3D 效果让Camera旋转,获取旋转偏移大小getCameraRotate(event);//获取平移大小getCameraTranslate(event);break;case MotionEvent.ACTION_UP://松开手 复原动画startRestore();break;}return true;}private void startRestore() {final String cameraRotateXName = "cameraRotateX";final String cameraRotateYName = "cameraRotateY";final String canvasTranslateXName = "canvasTranslateX";final String canvasTranslateYName = "canvasTranslateY";PropertyValuesHolder cameraRotateXHolder =PropertyValuesHolder.ofFloat(cameraRotateXName, mCameraRotateX, 0);PropertyValuesHolder cameraRotateYHolder =PropertyValuesHolder.ofFloat(cameraRotateYName, mCameraRotateY, 0);PropertyValuesHolder canvasTranslateXHolder =PropertyValuesHolder.ofFloat(canvasTranslateXName, mCameraTranslateX, 0);PropertyValuesHolder canvasTranslateYHolder =PropertyValuesHolder.ofFloat(canvasTranslateYName, mCameraTranslateY, 0);mValueAnimator = ValueAnimator.ofPropertyValuesHolder(cameraRotateXHolder,cameraRotateYHolder, canvasTranslateXHolder, canvasTranslateYHolder);mValueAnimator.setInterpolator(new TimeInterpolator() {@Overridepublic float getInterpolation(float input) {float f = 0.571429f;return (float) (Math.pow(2, -2 * input) * Math.sin((input - f / 4) * (2 * Math.PI) / f) + 1);}});mValueAnimator.setDuration(1000);mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {mCameraRotateX = (float) animation.getAnimatedValue(cameraRotateXName);mCameraRotateY = (float) animation.getAnimatedValue(cameraRotateYName);mCameraTranslateX = (float) animation.getAnimatedValue(canvasTranslateXName);mCameraTranslateX = (float) animation.getAnimatedValue(canvasTranslateYName);}});mValueAnimator.start();}/*** 获取Camera,平移大小* @param event*/private void getCameraTranslate(MotionEvent event) {float translateX = (event.getX() - getWidth() / 2);float translateY = (event.getY() - getHeight()/2);//求出此时位移的大小与半径之比float[] percentArr = getPercent(translateX, translateY);//最终位移的大小按比例匀称改变mCameraTranslateX = percentArr[0] * mMaxCameraTranslate;mCameraTranslateY = percentArr[1] * mMaxCameraTranslate;}/*** 让Camera旋转,获取旋转偏移大小* @param event*/private void getCameraRotate(MotionEvent event) {float mRotateX = -(event.getY()-(getHeight())/2);float mRotateY = (event.getX()-getWidth()/2);//求出旋转大小与半径之比float[] percentArr = getPercent(mRotateX,mRotateY);mCameraRotateX = percentArr[0]*mMaxCameraRotate;mCameraRotateY = percentArr[1]*mMaxCameraRotate;}/*** 获取比例* @param mCameraRotateX* @param mCameraRotateY* @return*/private float[] getPercent(float mCameraRotateX, float mCameraRotateY) {float[] percentArr = new float[2];float percentX = mCameraRotateX/width;float percentY = mCameraRotateY/width;//处理一下比例值if (percentX > 1) {percentX = 1;} else if (percentX < -1) {percentX = -1;}if (percentY > 1) {percentY = 1;} else if (percentY < -1) {percentY = -1;}percentArr[0] = percentX;percentArr[1] = percentY;return percentArr;}}

android仿小米指南针相关推荐

  1. android高仿小米时钟,Android小米时钟 Android仿小米时钟效果

    想了解Android仿小米时钟效果的相关内容吗,jane_dxj在本文为您仔细讲解Android小米时钟的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Android,时钟,下面大家一起来 ...

  2. android 仿小米日历 周视图 月视图切换

    android 仿小米日历,周视图左右滑动,月视图左右滑动,周视图月视图无缝切换: http://download.csdn.net/detail/chen352602412/9556162 插播广告 ...

  3. Android仿小米时钟

    最近在学自定义View,看到小米时钟这个效果,很想去了解一下是界面是如何绘制以及秒针,分针,时针是如何转动的,还有那个弧形颜色渐变效果.这是我参照Github上的效果弄的,Github地址:高仿小米时 ...

  4. android仿小米日历,实现一个仿小米日历控件

    先看效果图: 效果图 根据效果,我们可以看到,要实现该控件,需要具备: 容器以及触摸事件处理 周日历布局以及选择,切换上下周处理 月日历布局以及选择,切换上下月处理 首先说说容器 对于其他使用者来说, ...

  5. android仿小米运动,仿小米运动的运动记录界面

    [实例简介] 仿小米运动的运动记录界面,可用. [实例截图] [核心代码] MISportsConnectWidget-master └── MISportsConnectWidget-master ...

  6. Android仿小米时钟嵌套滑动(NestedScroll, 自定义behavior)

    最近无聊刷手机的时候, 发现小米时钟的嵌套滑动很有意思, 就试着做了下 先上对比图: 分析下小米时钟的滑动 闹钟列表 向上滑动时, 时钟面 透明度上升, 快到最大滑动时逐渐显示数字时钟. 在闹钟列表向 ...

  7. Android 仿小米锁屏实现九宫格解锁

    最近公司要求做个九宫格解锁,本人用的是小米手机,看着他那个设置锁屏九宫格很好看,就做了该组件,不使用图片资源,纯代码实现. 尊重每个辛苦的博主,在http://blog.csdn.net/mu399/ ...

  8. android 安全检测 动画,Android仿小米安全中心检测进度条效果

    模仿小米安全中心检测效果 废话少说,咱们先上效果图: 这个效果的使用场景并不多,主要是各种检测的时候,比如垃圾清理,手机安全检测, 当然如果你不嫌弃这个效果丑, 也可以用作进度条.哈哈. 下面说点干货 ...

  9. android仿小米运动,GitHub - luciferldy/Bnimation: 模仿即刻 App 点赞与数字跳动效果,模仿小米运动首页转圈圈的烟花效果...

    Bnimation 现阶段实现了模仿即刻点赞效果以及数字跳动增长,小米运动首页烟花转圈圈(•̀⌄•́)效果. 即刻 即刻的点赞效果 下面是我实现的效果(最下为 TextView 自带的展示数字效果) ...

最新文章

  1. mysql 数据库快照迁移_快照方式备份mysql 数据库
  2. mysql中的if else decode
  3. 20个开源项目助你快速掌握区块链应用开发,JS Go PHP Python Ruby
  4. 原来这就是局部有暴雨!
  5. 创建触发器,将数据库中表的修改记录进日志表
  6. 面向数据科学的概率论 二、计算几率
  7. java基础工具VisualVM介绍与详细使用
  8. python3.7模块内容_python3.7 time模块
  9. ng-options
  10. Spring容器和Spring应用上下文的理解
  11. 中国环境统计年鉴(2000到2018年)
  12. 部署企业的网络安全方案
  13. 同一工作组无法访问另一计算机,同一工作组无法访问如何解决【详解】
  14. idea中Rebuild是什么意思
  15. 基于unity3D的趣味桌球游戏开发
  16. 安利一个在线图片转ICO格式的网站
  17. 在houdini里,怎么手动设置输出物体的红绿蓝通道,便于nuke调节使用(基础篇)
  18. [原创] 神的计划2 - 创世纪 - 伊甸园的故事
  19. SpringBoot开发之JavaWeb回顾
  20. 详解活动图计算关键路径、最早开始时间、最晚开始时间、冗余时间,C++ 程序实现

热门文章

  1. 学了七年Android,连【架构师筑基必备技能】都不知道有什么
  2. 【机器学习】机器学习简介
  3. Android运行时Crash自动恢复框架-Recovery
  4. Vidyo提供的云化视频会议与传统的视频会议有什么区别?
  5. 银内胆保温杯的功效和作用
  6. dvwa之 file upload (low)一句话木马和中国菜刀
  7. PMP可以自学报考吗
  8. 来酷科技CEO周铭:以元宇宙生态构建Z时代数字原住民线下体验空间
  9. 用DESKTOP.INI和folder.htt来自动运行程序
  10. 驾考科目一:道路交通安全法律、法规和规章