第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

MaterialDesign+FullscreenImageView實(shí)現(xiàn)漂亮的登陸界面

標(biāo)簽:
Android

最近正在完成一个摇一摇的项目,打算加入一点社交元素。第一步是实现登陆界面,一个人独自设计加开发。最后的效果还是比较满意,但还是有性能上的损失,应该可以做得更好。

背景图片可以循环左右移动,使用MaterrialEdittext 实现了Edittext的向下兼容。此库继承自AppCompatEdittext,所以支持Edittext的所有特性,而且添加了字符检测,标签动画,组件颜色的定制等。有了它基本上可以忘记系统提供的Edittext了。API和下载地址

  1. FullscreenImageView
    主要是基于ImageView添加了自动缩放图片和自动滚动图片的动画。我的想法是:要让图片铺满ImageView,图片的高度一定要正好是ImageView的高度,但是图片宽度一定要比ImageView宽,这样动画播放才会把其余部分显示出来。所以,可以在onSizeChanged() 方法中得到组件的宽高(不能在其它地方尤其是构造方法中调用getWidth()或getHeight(),因为此时View的绘制过程不一定完成了)。如果图片高度和ImageView高度不符合,就进行缩放。下面是方法内部的代码。
 new AsyncTask<Object,Object,Bitmap>(){
            @Override
            protected Bitmap doInBackground(Object... params) {
                //预加载获取图片宽高
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = true;
                BitmapFactory.decodeResource((Resources) params[0],R.drawable.flowbloom,options);
                imageWidth = options.outWidth;
                imageHeight = options.outHeight;
                int inSampleSize = 1;
                //防止图片过大,出现OOM
                if (imageHeight > (Integer) params[2] ) {
                    final int halfHeight = imageHeight / 2;

                    while ((halfHeight / inSampleSize) > (Integer) params[2]) {
                        inSampleSize *= 2;
                    }
                }
                options.inSampleSize = inSampleSize;
                options.inJustDecodeBounds = false;

                return BitmapFactory.decodeResource((Resources)params[0],R.drawable
                        .flowbloom,options);
            }

            @Override
            protected void onPostExecute(Bitmap background) {
                setImageBitmap(background);

                Drawable d = getDrawable();
                if (d == null) return;

                int dw = d.getIntrinsicWidth();
                int dh = d.getIntrinsicHeight();

                Log.i(TAG,"onPostExecute: dw: " + dw + " dh :" + dh);

                float scale; //缩放值
                scale = getHeight() * 1f / dh;

                matrix.postScale(scale,scale);
                matrix.postTranslate(-100,0);
                setImageMatrix(matrix);
            }
        }.execute(getResources(),w,h);

这里使用了 AsyncTask 新开了一个线程加载图片,然而效果并不好,反而在打开登陆界面时有一段时间的黑屏过程,还不如直接在UI线程中加载。

这里遇到了两个坑:
1、使用Matrix控制图片必须在xml文件中为ImageView添加android:scaleType="matrix"
2、放在不同资源限定符的drawable文件夹中的Bitmap,它的Density属性是不同的。而每个设备的TargetDensity属性也是不同的(小米note是440,Vivo X3t 是320) ,系统就是根据TargetDensity到不同的drawable文件夹找图片的。举个例子,我只在drawable-mdpi中放了一张图片,那它的Density是160(图片像素1440x900)。小米note加载这张图片,因为drawable-xxhdpi没图片,于是它会对其进行缩放1440 x (440 \ 160) = 3960 , 900 x (440 \ 160 ) = 2475。于是内存中图片的真正像素是(3960 x 2475)。所以,如果不注意为每个drawable文件夹配上图片,可能不同设备上的图片像素会不一致。(注意:测试系统 API23、AndroidStudio2.1)

自动滚动图片是由一个MoveImageAnimator实现的动画的效果。

private class MoveImageAnimator extends Animation {
        @Override
        protected void applyTransformation(float interpolatedTime,Transformation t) {
            super.applyTransformation(interpolatedTime,t);
            RectF r = getMatrixRectF();

            if (r.left > 0 || r.right < getWidth()) {
                back = !back;
            }

            if (back) {
                matrix.postTranslate(2,0);
            } else {
                matrix.postTranslate(-2,0);
            }
            setImageMatrix(matrix);

        }
    }

移动方法很简单,使用Matrix对图片进行水平位移操作。这里需要注意的就是对图片左右边框的判断,如果到达图片的左右边框,让back=!back 就是碰撞到边框马上返回。检测图片的左右边框可以使用下面的方法:

/**
     * 此方法能获取View中图片的描述RectF
     * @return
     */
    private RectF getMatrixRectF() {
        Matrix m = matrix;
        RectF rectF = new RectF();

        Drawable d = getDrawable();
        if (d != null) {
            rectF.set(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight());//当前图片宽高(不改变的)
            m.mapRect(rectF);//将matrix中的值映射到rectF中
        }

        return rectF;
    }
點(diǎn)擊查看更多內(nèi)容
8人點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消