精华内容
下载资源
问答
  • 新入mate9pro 到一个月,手贱升级了系统版本,出现导航搜索到卫星的情况,软件下载了高德地图、腾讯地图、百度地图,逐一卸载安装重试,没一个能成功的,后来又下载了专业搜星软件,还是到卫星,无耐,只能...

    新入mate9pro 不到一个月,手贱升级了系统版本,出现导航搜索不到卫星的情况,软件下载了高德地图、腾讯地图、百度地图,逐一卸载安装重试,没一个能成功的,后来又下载了专业搜星软件,还是搜不到卫星,无耐,只能找售后。

    之前小米mix2,一加5t等也碰到过更新出现乱七八糟的故障的情况,在此还是谨记,系统出厂版本千万别去乱升级,厂家出厂的版本是做过严谨的测试的,而后出的版本或多或少会出现各种异常,谨记谨记千万别乱升级。

    转载于:https://www.cnblogs.com/RogerLu/p/9347036.html

    展开全文
  • 如今科技日新月异,而手机系统也是一样的,现在的手机系统更新的速度特别快,不管是苹果手机还是安卓手机,在系统大更新时,还没有几天就能收到手机提示的系统更新,但手机更新到最新的系统真的吗?更新后又会出现...

    如今科技日新月异,而手机系统也是一样的,现在的手机系统更新的速度特别快,不管是苹果手机还是安卓手机,在系统大更新时,还没有几天就能收到手机提示的系统更新,但手机更新到最新的系统真的好吗?更新后又会出现什么新问题呢?下面笔者就说说手机该不该升级到最新的系统。
    在这里插入图片描述
    升级系统的优点
    修复BUG
    科技是不断发展的,可能系统在当时没有漏洞,但随着时间的推移,网络上出现了新的病毒,或者底层系统被人发现了漏洞,手机厂商为了用户信息的安全,就会推送系统升级提示。
    在这里插入图片描述
    新增功能
    随着用户需求的增多,手机厂商也会在系统中新增一些功能满足用户的需求,也是为了用户能有更好的体验感,这也是最常见的更新情况。
    在这里插入图片描述
    体验最新技术
    安卓和IOS系统每年都会有一次大更新,每次大更新都有很多新技术,并且还会增加很多新功能,而升级后也会变的流畅。
    在这里插入图片描述
    升级系统的缺点
    掉电更快
    系统再升级后,硬件和软件要重新磨合,所以在升级新系统后的几天,掉电会比之前快很多。
    在这里插入图片描述
    软件不兼容
    一般的小更新不会出现这种情况,但是每次更新系统底层后,就会有很多应用不兼容,出现卡顿、闪退的情况,一般将应用更新到最新版本就能解决。
    在这里插入图片描述
    卡顿
    正常情况下手机越升级越流畅,但是现在升级越来越频繁,对手机硬件的要求越来越高,旗舰机型升级会越来越好用,但千元机或者老旧机型由于硬件的不足,越更新就会越卡顿。
    在这里插入图片描述
    笔者观点:
    如果想3年以上不换手机,建议减少更新次数,而对于一两年就想换手机的朋友,有升级就可以点,新技术才有更好的体验感。并且在升级前记得备份哦,避免意外升级失败而造成数据丢失。
    在这里插入图片描述
    以上就是笔者分享的内容了,看完后想必大家都知道自己的手机该不该升级了吧,如果还有其他关于手机操作的问题也可以问笔者哦,笔者知无不答。

    展开全文
  • 有必要每次都更新吗无论是苹果用户还是安卓用户,手机系统升级都是大家必须面对的一个话题。不过对于系统升级,用户的态度却并一致。有些人每次都会第一时间更新,另一些人则非常讨厌系统升级。那么,系统升级究竟...

    苹果IOS系统更新有什么好处?有必要每次都更新吗无论是苹果用户还是安卓用户,手机系统升级都是大家必须面对的一个话题。不过对于系统升级,用户的态度却并不一致。有些人每次都会第一时间更新,另一些人则非常讨厌系统升级。那么,系统升级究竟好不好,我们是否有必要进行系统升级呢?今天,我就来和大家聊聊有关系统升级的那些事儿。

    bebe521bbd76a49b49ebcf1c6c4cc68d.png

    苹果IOS系统更新有什么好处?有必要每次都更新吗

    ● 系统升级的好处

    手机厂商之所以愿意花功夫为用户提供全新的系统升级,自然是因为系统升级能够给手机带来更好的体验。一般来讲,苹果或者安卓手机厂商为用户进行新系统的推送往往会对手机的流畅性、稳定性等多方面进行优化。

    1.提高系统稳定性。对于用户来说,系统稳定无Bug往往会给他们带来更好的系统体验。所以手机厂商的新版本系统多数都会修复上一个版本存在的Bug,以提高系统的稳定性和系统的安全性。

    一般来说,一款手机刚刚上市时存在Bug可能较多。就拿小米6为例,刚刚上市的时候就有不少用户遇到了WiFi断流、充电重启的问题。而现在版本的系统已经解决了这些问题,对于用户来讲,如果在系统使用中遇到了一些系统问题,那么可以查看更新日志,然后考虑对系统进行升级。

    2c77d156258c951dbfb30d86d3c05ac5.png

    苹果IOS系统更新有什么好处?有必要每次都更新吗

    2.提高系统流畅性。除了稳定性之外,系统更新日志中,往往会提到“提升系统流畅性”这一条,同样可以看作是手机厂商为了提升用户体验之举。手机厂商往往会对系统运行机制、硬件发挥进行优化,从而提高系统的流畅性。

    3.增加全新的功能。而且,手机厂商还会通过软件升级来为手机带来全新的功能,这一点在大版本更新当中尤为常见,比如说ios9升级到iOS10,系统的通知中心就发生了很大的改变;又比如说下周即将到来的MIUI8体验版也将会加入全新的分屏功能。

    2f04d605659e8e04d3ac0587c4067c5d.png

    苹果IOS系统更新有什么好处?有必要每次都更新吗

    展开全文
  • <ul><li>电脑操作系统:[eg.Windows/Mac OS/Linux]</li><li>手机系统:[eg.Android 8.1/iOS 11.0]</li><li>SDK分支: [eg.master/10000/...]</li><li>相关模块:[eg.Host/Service/Account]</li></ul> 现象 点击设置---...
  • 今天聊聊属性动画和自定义View搭配使用,前面都讲到自定义View和属性动画,但是一起用的还是不多,刚巧今晚手机提示我更新系统,我看到那个更新的动画还不错,仔细的分析了一下,于是我也决定写一个,不是一模一样的...

    晚上好,现在是凌晨两点半,然后我还在写代码。电脑里播放着《凌晨两点半》,晚上写代码,脑子更清醒,思路更清晰。

    今天聊聊属性动画和自定义View搭配使用,前面都讲到自定义View和属性动画,但是一起用的还是不多,刚巧今晚手机提示我更新系统,我看到那个更新的动画还不错,仔细的分析了一下,于是我也决定写一个,不是一模一样的,但是效果和原理是一样的。

    先看看图:

    这里写图片描述

    这是一张静态的图,这里有三个波浪线,当下载完之后,波浪线会往上活动,一直到消失。

    所以难点也是在这个波浪线上。这个波浪线类似于一个水波纹,也有很多的大神写过水波纹的效果,所以当我们知道这个是什么的时候,就比较容易实现这个功能了。

    这一次,先看看用到了什么关键的技术。

    首先要介绍的,就是高中的时候学过的余弦函数,还记得表达式吗?
    y = Asin(wx+b)+h
    这个公式里:w影响周期,A影响振幅,h影响y位置,b为初相;

    接下来就看看这一次用到了哪些变量:

    // y = Asin(wx+b)+h
        private static final float STRETCH_FACTOR_A = 50;
        private static final int OFFSET_Y = 0;
        // 第一条水波移动速度
        private static final int TRANSLATE_X_SPEED_ONE = 7;
        // 第二条水波移动速度
        private static final int TRANSLATE_X_SPEED_TWO = 5;
        // 第三条水波移动速度
        private static final int TRANSLATE_X_SPEED_Three = 10;
        private float mCycleFactorW;
    
        private int mTotalWidth, mTotalHeight;
        private float[] mYPositions;
        private float[] mResetOneYPositions;
        private float[] mResetTwoYPositions;
        private float[] mResetThreeYPositions;
        private int mXOffsetSpeedOne;
        private int mXOffsetSpeedTwo;
        private int mXOffsetSpeedThree;
    
        private int mXOneOffset;
        private int mXTwoOffset;
        private int mXThreeOffset;
    
        private int height = 1200;
    
        private Paint mWavePaint, mWavePaint2,mWavePaint3;
        private DrawFilter mDrawFilter;

    都是常规的,像画笔、高宽等等。

    然后看看初始化的操作,在构造函数里面:

        public WaterRipple(Context context, AttributeSet attrs) {
            super(context, attrs);
            // 将dp转化为px,用于控制不同分辨率上移动速度基本一致
            mXOffsetSpeedOne = DensityUtil.dip2px(context, TRANSLATE_X_SPEED_ONE);
            mXOffsetSpeedTwo = DensityUtil.dip2px(context, TRANSLATE_X_SPEED_TWO);
            mXOffsetSpeedThree = DensityUtil.dip2px(context, TRANSLATE_X_SPEED_Three);
            // 初始绘制波纹的画笔
            mWavePaint = new Paint();
            // 去除画笔锯齿
            mWavePaint.setAntiAlias(true);
            // 设置风格为实线
            mWavePaint.setStyle(Style.FILL);
            // 设置画笔颜色
            mWavePaint.setColor(Color.parseColor("#ffffff"));
            mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
                    | Paint.FILTER_BITMAP_FLAG);
    
            // 初始绘制波纹的画笔
            mWavePaint2 = new Paint();
            // 去除画笔锯齿
            mWavePaint2.setAntiAlias(true);
            // 设置风格为实线
            mWavePaint2.setStyle(Style.FILL);
            // 设置画笔颜色
            mWavePaint2.setColor(Color.parseColor("#eeeeee"));
    
            // 初始绘制波纹的画笔
            mWavePaint3 = new Paint();
            // 去除画笔锯齿
            mWavePaint3.setAntiAlias(true);
            // 设置风格为实线
            mWavePaint3.setStyle(Style.FILL);
            // 设置画笔颜色
            mWavePaint3.setColor(Color.parseColor("#ffffff"));
        }
    
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            // 记录下view的宽高
            mTotalWidth = w;
            mTotalHeight = h;
            // 用于保存原始波纹的y值
            mYPositions = new float[mTotalWidth];
            // 用于保存波纹一的y值
            mResetOneYPositions = new float[mTotalWidth];
            // 用于保存波纹二的y值
            mResetTwoYPositions = new float[mTotalWidth];
            // 用于保存波纹三的y值
            mResetThreeYPositions = new float[mTotalWidth];
            // 将周期定为view总宽度
            mCycleFactorW = (float) (2 * Math.PI / mTotalWidth);
    
            // 根据view总宽度得出所有对应的y值
            for (int i = 0; i < mTotalWidth; i++) {
                mYPositions[i] = (float) (STRETCH_FACTOR_A
                        * Math.sin(mCycleFactorW * i) + OFFSET_Y);
            }
        }
    

    这个初始化倒是不用怎么解释,重点说一下下面的方法:

    private void resetPositonY() {
            // mXOneOffset代表当前第一条水波纹要移动的距离
            int yOneInterval = mYPositions.length - mXOneOffset;
            // 使用System.arraycopy方式重新填充第一条波纹的数据
            // 第一个参数就是源数组,第二个参数是要复制的源数组中的起始位置,
            // 第三个参数是目标数组,第四个参数是要复制到的目标数组的起始位置,第五个参数是要复制的元素的长度
            System.arraycopy(mYPositions, mXOneOffset, mResetOneYPositions, 0,
                    yOneInterval);
            System.arraycopy(mYPositions, 0, mResetOneYPositions, yOneInterval,
                    mXOneOffset);
    
            int yTwoInterval = mYPositions.length - mXTwoOffset;
    
            System.arraycopy(mYPositions, mXTwoOffset, mResetTwoYPositions, 0,
                    yTwoInterval);
            System.arraycopy(mYPositions, 0, mResetTwoYPositions, yTwoInterval,
                    mXTwoOffset);
    
            int yThreeInterval = mYPositions.length - mXThreeOffset;
    
            System.arraycopy(mYPositions, mXThreeOffset, mResetThreeYPositions, 0,
                    yThreeInterval);
            System.arraycopy(mYPositions, 0, mResetThreeYPositions, yThreeInterval,
                    mXThreeOffset);
    
        }

    这里面用到了一个System.arraycopy的方法,这个在我们平时的时候可能用得比较少,但是确实非常好用,建议大家可以看看这个的具体用法。我这里也是尽量的写满注释,以便更好的理解。

    接下来就是最关键的onDraw方法,代码如下:

    @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            // 从canvas层面去除绘制时锯齿
            canvas.setDrawFilter(mDrawFilter);
            resetPositonY();
            for (int i = 0; i < mTotalWidth; i++) {
                // 绘制第一条水波纹
                canvas.drawLine(i, mTotalHeight - mResetOneYPositions[i] - height,
                        i, mTotalHeight, mWavePaint);
    
                // 绘制第二条水波纹
                canvas.drawLine(i, mTotalHeight - mResetTwoYPositions[i] - height
                        + 200, i, mTotalHeight, mWavePaint2);
    
                // 绘制第三条水波纹
                canvas.drawLine(i, mTotalHeight - mResetThreeYPositions[i] - height
                        + 400, i, mTotalHeight, mWavePaint3);
    
            }
    
            // 改变两条波纹的移动点
            mXOneOffset += mXOffsetSpeedOne;
            mXTwoOffset += mXOffsetSpeedTwo;
            mXThreeOffset += mXOffsetSpeedThree;
    
            // 如果已经移动到结尾处,则重新记录
            if (mXOneOffset >= mTotalWidth) {
                mXOneOffset = 0;
            }
            if (mXTwoOffset > mTotalWidth) {
                mXTwoOffset = 0;
            }
            if (mXThreeOffset > mTotalWidth) {
                mXThreeOffset = 0;
            }
        }

    我这里绘制了三个波浪线,以及处理了一些在绘制中的数据。

    最后暴露给外面一个方法,用于动态的调整高度。

    
        public void setHeight(int height) {
            this.height = height;
            postInvalidate();
        }

    最重要的View已经绘制出来了,下面看看其他的代码:

    首先是布局文件,activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#12ADFF"
        tools:context=".MainActivity" >
    
        <com.ltl.waterripple.WaterRipple
            android:id="@+id/hehe"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <RelativeLayout
            android:id="@+id/relativi"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >
    
                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" >
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentRight="true"
                        android:layout_margin="5dip"
                        android:text="设置"
                        android:textColor="#ffffff"
                        android:textSize="20sp" />
                </RelativeLayout>
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="5dip"
                    android:gravity="center"
                    android:text="Funtouch OS"
                    android:textColor="#ffffff"
                    android:textSize="40sp" />
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="5dip"
                    android:gravity="center"
                    android:text="Power For Android"
                    android:textColor="#ffffff"
                    android:textSize="20sp" />
            </LinearLayout>
    
            <LinearLayout
                android:id="@+id/content_linear"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:orientation="vertical"
                android:padding="20dip" >
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center_vertical"
                    android:text="更新版本:vivo rev 1.14.1(81MB)" />
    
                <View
                    android:layout_width="match_parent"
                    android:layout_height="1px"
                    android:layout_marginBottom="10dip"
                    android:layout_marginTop="10dip"
                    android:background="#eeeeee" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="系统"
                    android:textStyle="bold" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="更新了部分第三方应用图标" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="优化了系统与一些第三方应用的兼容性" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="优化了应用安装体验" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="发现威胁会有弹窗提醒" />
    
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dip"
                    android:background="#eeeeee"
                    android:padding="1px" >
    
                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="#ffffff"
                        android:clickable="true"
                        android:gravity="center"
                        android:onClick="onClick"
                        android:padding="5dip"
                        android:text="下载并安装"
                        android:textSize="20sp"
                        android:textStyle="bold" />
                </LinearLayout>
            </LinearLayout>
    
            <LinearLayout
                android:id="@+id/progress_linear"
                android:layout_width="match_parent"
                android:layout_height="200dip"
                android:layout_alignParentBottom="true"
                android:gravity="center|bottom"
                android:orientation="vertical"
                android:padding="20dip"
                android:visibility="gone" >
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textSize="25sp"
                    android:text="当前版本:2.354785" />
    
                <TextView
                    android:id="@+id/text_state"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="状态" />
    
                <ProgressBar
                    android:id="@+id/progressBar1"
                    style="?android:attr/progressBarStyleHorizontal"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />
            </LinearLayout>
        </RelativeLayout>
    
    </RelativeLayout>

    这一次的布局写的比较多,也是用到了多层的嵌套。所以在阅读的时候要很注意细节。

    接下来是MainActivity.java:

    public class MainActivity extends Activity {
        private int height2 = 1200;
        private int size = 0;
        private ProgressBar bar;
        private int height;
        private WaterRipple ripple;
        private TextView text_state;
        private LinearLayout layout1, layout2;
        private RelativeLayout layout;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
            ripple = (WaterRipple) findViewById(R.id.hehe);
            bar = (ProgressBar) findViewById(R.id.progressBar1);
            layout1 = (LinearLayout) findViewById(R.id.content_linear);
            layout2 = (LinearLayout) findViewById(R.id.progress_linear);
            text_state = (TextView) findViewById(R.id.text_state);
            layout = (RelativeLayout) findViewById(R.id.relativi);
            WindowManager wm = this.getWindowManager();
            height = wm.getDefaultDisplay().getHeight();
            height2 = (int)(height*0.7);
            ripple.setHeight(height2);
            bar.setMax(81);
        }
    
        Handler handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
    
                switch (msg.what) {
                case 1:
                    if (size < 81) {
                        bar.setProgress(size);
                        text_state.setText("下载进度:"
                                + (float) (((float) (size) / 81) * 100) + "%");
                        size++;
    
                    } else {
                        startAnim();
                        layout2.setVisibility(View.GONE);
                    }
                    break;
                case 2:
                    ripple.setHeight(height2);
    
                    ViewGroup.LayoutParams params = layout.getLayoutParams();
                    params.height = height - height2;
                    layout.setLayoutParams(params);
                    height2++;
                    break;
                case 3:
                    ObjectAnimator animator = ObjectAnimator.ofFloat(ripple,
                            "alpha", 1f, 0f,0.5f);
                    ObjectAnimator animator2 = ObjectAnimator.ofFloat(layout,
                            "alpha", 1f, 0f,0.5f);
                    AnimatorSet animatorSet = new AnimatorSet();
                    animatorSet.playTogether(animator, animator2);
                    animatorSet.setDuration(300);
                    animatorSet.start();
                    break;
                default:
                    break;
                }
    
            };
        };
    
        public void onClick(View v) {
            new Thread(new Runnable() {
                public void run() {
                    while (size < 81) {
                        SystemClock.sleep(100);
                        handler.sendEmptyMessage(1);
                    }
                }
            }).start();
            layout1.setVisibility(View.GONE);
            layout2.setVisibility(View.VISIBLE);
        }
    
        public void startAnim() {
            new Thread(new Runnable() {
                public void run() {
                    while (height2 < height) {
                        SystemClock.sleep(100);
                        handler.sendEmptyMessage(2);
                    }
                    handler.sendEmptyMessage(3);
                }
            }).start();
        }
    
    }
    

    这里我有两个线程,主要是控制下载的进度展示和水波纹效果。具体的参数,使用者可以根据自己的需要,再作调整。

    这里面也用了一个工具类DensityUtil.java:

    public class DensityUtil {
    
        /**
         * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
         */
        public static int dip2px(Context context, float dpValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (dpValue * scale + 0.5f);
        }
    
        /**
         * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
         */
        public static int px2dip(Context context, float pxValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (pxValue / scale + 0.5f);
        }
    }

    还有那个控件WaterRipple.java:

    public class WaterRipple extends View {
    
        // y = Asin(wx+b)+h
        private static final float STRETCH_FACTOR_A = 50;
        private static final int OFFSET_Y = 0;
        // 第一条水波移动速度
        private static final int TRANSLATE_X_SPEED_ONE = 7;
        // 第二条水波移动速度
        private static final int TRANSLATE_X_SPEED_TWO = 5;
        // 第三条水波移动速度
        private static final int TRANSLATE_X_SPEED_Three = 10;
        private float mCycleFactorW;
    
        private int mTotalWidth, mTotalHeight;
        private float[] mYPositions;
        private float[] mResetOneYPositions;
        private float[] mResetTwoYPositions;
        private float[] mResetThreeYPositions;
        private int mXOffsetSpeedOne;
        private int mXOffsetSpeedTwo;
        private int mXOffsetSpeedThree;
    
        private int mXOneOffset;
        private int mXTwoOffset;
        private int mXThreeOffset;
    
        private int height = 1200;
    
        private Paint mWavePaint, mWavePaint2,mWavePaint3;
        private DrawFilter mDrawFilter;
    
        public WaterRipple(Context context, AttributeSet attrs) {
            super(context, attrs);
            // 将dp转化为px,用于控制不同分辨率上移动速度基本一致
            mXOffsetSpeedOne = DensityUtil.dip2px(context, TRANSLATE_X_SPEED_ONE);
            mXOffsetSpeedTwo = DensityUtil.dip2px(context, TRANSLATE_X_SPEED_TWO);
            mXOffsetSpeedThree = DensityUtil.dip2px(context, TRANSLATE_X_SPEED_Three);
            // 初始绘制波纹的画笔
            mWavePaint = new Paint();
            // 去除画笔锯齿
            mWavePaint.setAntiAlias(true);
            // 设置风格为实线
            mWavePaint.setStyle(Style.FILL);
            // 设置画笔颜色
            mWavePaint.setColor(Color.parseColor("#ffffff"));
            mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
                    | Paint.FILTER_BITMAP_FLAG);
    
            // 初始绘制波纹的画笔
            mWavePaint2 = new Paint();
            // 去除画笔锯齿
            mWavePaint2.setAntiAlias(true);
            // 设置风格为实线
            mWavePaint2.setStyle(Style.FILL);
            // 设置画笔颜色
            mWavePaint2.setColor(Color.parseColor("#eeeeee"));
    
            // 初始绘制波纹的画笔
            mWavePaint3 = new Paint();
            // 去除画笔锯齿
            mWavePaint3.setAntiAlias(true);
            // 设置风格为实线
            mWavePaint3.setStyle(Style.FILL);
            // 设置画笔颜色
            mWavePaint3.setColor(Color.parseColor("#ffffff"));
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            // 从canvas层面去除绘制时锯齿
            canvas.setDrawFilter(mDrawFilter);
            resetPositonY();
            for (int i = 0; i < mTotalWidth; i++) {
    
                // 减400只是为了控制波纹绘制的y的在屏幕的位置,大家可以改成一个变量,然后动态改变这个变量,从而形成波纹上升下降效果
                // 绘制第一条水波纹
                canvas.drawLine(i, mTotalHeight - mResetOneYPositions[i] - height,
                        i, mTotalHeight, mWavePaint);
    
                // 绘制第二条水波纹
                canvas.drawLine(i, mTotalHeight - mResetTwoYPositions[i] - height
                        + 200, i, mTotalHeight, mWavePaint2);
    
                // 绘制第三条水波纹
                canvas.drawLine(i, mTotalHeight - mResetThreeYPositions[i] - height
                        + 400, i, mTotalHeight, mWavePaint3);
    
            }
    
            // 改变两条波纹的移动点
            mXOneOffset += mXOffsetSpeedOne;
            mXTwoOffset += mXOffsetSpeedTwo;
            mXThreeOffset += mXOffsetSpeedThree;
    
            // 如果已经移动到结尾处,则重头记录
            if (mXOneOffset >= mTotalWidth) {
                mXOneOffset = 0;
            }
            if (mXTwoOffset > mTotalWidth) {
                mXTwoOffset = 0;
            }
            if (mXThreeOffset > mTotalWidth) {
                mXThreeOffset = 0;
            }
    
            // 引发view重绘,一般可以考虑延迟20-30ms重绘,空出时间片
    
        }
    
        private void resetPositonY() {
            // mXOneOffset代表当前第一条水波纹要移动的距离
            int yOneInterval = mYPositions.length - mXOneOffset;
            // 使用System.arraycopy方式重新填充第一条波纹的数据
            // 第一个参数就是源数组,第二个参数是要复制的源数组中的起始位置,
            // 第三个参数是目标数组,第四个参数是要复制到的目标数组的起始位置,第五个参数是要复制的元素的长度
            System.arraycopy(mYPositions, mXOneOffset, mResetOneYPositions, 0,
                    yOneInterval);
            System.arraycopy(mYPositions, 0, mResetOneYPositions, yOneInterval,
                    mXOneOffset);
    
            int yTwoInterval = mYPositions.length - mXTwoOffset;
    
            System.arraycopy(mYPositions, mXTwoOffset, mResetTwoYPositions, 0,
                    yTwoInterval);
            System.arraycopy(mYPositions, 0, mResetTwoYPositions, yTwoInterval,
                    mXTwoOffset);
    
            int yThreeInterval = mYPositions.length - mXThreeOffset;
    
            System.arraycopy(mYPositions, mXThreeOffset, mResetThreeYPositions, 0,
                    yThreeInterval);
            System.arraycopy(mYPositions, 0, mResetThreeYPositions, yThreeInterval,
                    mXThreeOffset);
    
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            // 记录下view的宽高
            mTotalWidth = w;
            mTotalHeight = h;
            // 用于保存原始波纹的y值
            mYPositions = new float[mTotalWidth];
            // 用于保存波纹一的y值
            mResetOneYPositions = new float[mTotalWidth];
            // 用于保存波纹二的y值
            mResetTwoYPositions = new float[mTotalWidth];
            // 用于保存波纹三的y值
            mResetThreeYPositions = new float[mTotalWidth];
            // 将周期定为view总宽度
            mCycleFactorW = (float) (2 * Math.PI / mTotalWidth);
    
            // 根据view总宽度得出所有对应的y值
            for (int i = 0; i < mTotalWidth; i++) {
                mYPositions[i] = (float) (STRETCH_FACTOR_A
                        * Math.sin(mCycleFactorW * i) + OFFSET_Y);
            }
        }
    
        public void setHeight(int height) {
            this.height = height;
            postInvalidate();
        }
    
    }

    以上就是全部内容,有个bug,就是在转换的时候部分手机会出现卡顿,后面我加上插值器调整一下,先睡了。如果代码有什么不妥的地方欢迎指出。

    源码地址

    展开全文
  • 手机 启用黑暗模式,关闭用户体验 ,卸载很多应用,手机感觉还是占用内存高,上华为论坛学习了一下,得到华为安卓手机的精简方法,当然其他安卓手机也是可以用的 下面开始adb大法卸载停用更多用到的系统应用 注意...
  • 天人文章管理系统是asp+access/mssql架构网站系统,如对默认模板满意,在后台可更换其他模板。电脑版,手机版,平板版无缝自动切换,一个...天人文章管理系统(带手机版) 更新日志: 4.33更新: 优化应用中心加载逻辑
  • 天人文章管理系统是asp+access/mssql架构网站系统,如对默认模板满意,在后台可更换其他模板。电脑版,手机版,平板版无缝...天人文章管理系统(带手机版) 更新日志: 4.39更新: 优化站长统计代码字节数的最大数量
  • 手机用家的讨论,主要适用于S4港版八核官方固件,高通U用户和国行...论坛多有人提及的发热问题,耗电问题无疑与手机的软硬件优化有关,手机到手后,再谈硬件问题为时已晚,事实上,通过简单的优化,还是可以将耗电
  • 天人文章管理系统(带手机版) 3.55更新: 修正一处可能出现的上传文件权限验证问题 修正admin文件夹改名后浏览服务器图片失效的问题 增加应用中心会员注册后自动登录插件 优化应用中心老Y文章系统数据无缝迁移至...
  • 天人文章管理系统(带手机版)v4.75 GB2312更新日志 优化伪静态插件的安装接口 程序支持子目录,支持放到站点的下级,或多级目录中。 1、后台服务器信息查看功能能够快速、全面的查看服务器的软硬件状况。 2、站点...
  • iOS13.3软件闪退请按如下方法操作: 通用 — 还原 — 还原网络设置 — 重启可修复软件闪退问题。 有可能会复发,重做一次...还是用初始系统好啊,没有大问题就别更新了,更新了就停下来了,唉,吃了没钱的亏哦 ...
  • 后来找了查了一圈资料,是因为安卓手机系统不会真的卸载apk.所以这个时候就需要adb 命令删除了。目前亲测已成功。 解决办法如下: 首先找到你的adb路径,或者你已经配置了adb,那就直接使用adb命令,确认adb是否...
  • <ul><li>电脑操作系统:[eg.Windows/Mac OS/Linux]Mac OS</li><li>手机系统:[eg.Android 8.1/iOS 11.0] iOS 11.0</li><li>相关模块:[eg.Host/Service/Account]</li></ul> 现象 想看小米demo里面的UI,之前869...
  • 有幸终于找到一个专门收集电脑手机外设固件包的论坛版块,站内邮件和版主沟通后, 终于拿到了一个BLACKWIDOW云端修复固件的FIRMWARE程序,经过不断摸索尝试后, 成功将砖头蛇救活,云端固件目前更新到2.05.03,目前...
  • EbuyCMS易购商城系统 1.6 更新日志:2020-08-30[新增]微信可视化小程序(高级版授权可发布,其余仅可体验);[修复]修复首页价格错误问题;[修复]修复优惠券可被强制刷券问题;[修复]修复手机端商品详情页库存显示问题...
  • 只有手机真正跳过去了就(命令执行也失败的),但是看到执行报告截到的图片还是跳转前的画面,于是找到目标失败了。其他手机是可以的,然后我试着直接打开到这个页面再点击...
  • 4.修复上传新头像不更新的问题 5.修复错误:undefined variable 6.修复后台设定的一处错误 7.解决底部固定最下部的问题 8.重构全局统计 9.改变贴子字数限制 10.改进用户删除系统 11.改进回复的统计 12.修复...
  • 4)还原成功后,进入系统设置确认你的域名和默认模板,默认是在templets目录下的default,还是最好确认一下。 5、确定网站风格后(无论是否修改,都点击一下确定); 6、更新整站缓存: 点击‘生成’-'更新系统...
  • 墨子企业官网系统 v1.8.0 更新日志 Feature 安装Exif扩展判断 Feature 引导安装提示用语不当 Bugfix 修复后台自动升级 Feature 增加IIS伪静态文件web.config Feature 增加招聘模块 Feature 升级后台界面 墨子...
  • 如今是移动互联的时代,CuuMall开发团队紧跟时代脉搏,CuuMall免费开源商城系统移动版CuuMall手机免费商城系统也即将上线,CuuMall商城系统真正做到传统互联与移动互联的全面整合和打通,提高使用者的核心竞争力。...
  • 手机 pdf 阅读器

    2009-02-12 23:00:29
    多数人还是喜欢logo,因此加了进来,喜欢logo的人可以直接删除包中的logo.png文件 再次改进图片的阅读能力,小于100K的图片采用系统解码,采用高内存方式解码,>500K采用流式解码,对于ZIP中>256K的图片不再解码 ...
  • 4)还原成功后,进入系统设置确认你的域名和默认模板,默认是在templets目录下的default,还是最好确认一下。 5、确定网站风格后(无论是否修改,都点击一下确定); 6、更新整站缓存: 点击‘生成’-'更新系统...
  • 电脑端下载别人上传了的OTA文件,放到手机里面升级不管是在线下载,还是电脑端下载,都需要注意几点:1.必须是官方系统,也就是说是刷过ruu或者通过rec进行官方系统恢复。可以精简系统,可以root系统,但是能...
  •  针对业务型公司优胜劣汰的特性,业务员可能几年跟进同一家企业而没有建树,但客户资源还是要在公司内部流通,所以在这个时候就需要受到有效期的制约,超过有效期则能修改客户信息;  2.为什么可以修改...
  • 4)还原成功后,进入系统设置确认你的域名和默认模板,默认是在templets目录下的default,还是最好确认一下。 5、确定网站风格后(无论是否修改,都点击一下确定); 6、更新整站缓存: 点击‘生成’-'更新系统...
  • 4)还原成功后,进入系统设置确认你的域名和默认模板,默认是在templets目录下的default,还是最好确认一下。 5、确定网站风格后(无论是否修改,都点击一下确定); 6、更新整站缓存: 点击‘生成’-'更新系统...
  • 名易OA软件协同办公系统是一款专业好用的办公软件...名易OA软件协同办公系统 v1.2.1.0更新日志 一、文件管理优化 二、工作流程优化,增加表单留痕功能 三、优化系统,解除了一些bug功能 名易OA软件协同办公系统截图
  • 4)还原成功后,进入系统设置确认你的域名和默认模板,默认是在templets目录下的default,还是最好确认一下。 5、确定网站风格后(无论是否修改,都点击一下确定); 6、更新整站缓存: 点击‘生成’-'更新系统...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 257
精华内容 102
关键字:

手机系统更新好还是不更新好