锁屏效果

来源:互联网 发布:武侠台词 知乎 编辑:程序博客网 时间:2024/06/05 07:39

项目用到的一个锁屏效果,搞了两天,总结一下:

效果为 跟着手指的滑动部分逐渐透明,时间布局逐渐下移直至消失

代码如下:参考了http://blog.163.com/www_iloveyou_com/blog/static/21165837220154280392798/

import java.lang.ref.WeakReference;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PointF;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.RectF;import android.graphics.Xfermode;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.ImageView;public class MyRelativeLayout extends ImageView {    private static final String TAG = "wyn_layout";    protected Context mContext;    private float lastTouchX = 0;    private float lastTouchY = 0;            private float firstTouchY;    private float firstTouchX;        private int mWidth;    private int mHeight;    //    private static final Xfermode sXfermode = new PorterDuffXfermode(            PorterDuff.Mode.XOR);    // private BitmapShader mBitmapShader;    private Bitmap mMaskBitmap;    private Paint mPaint;    private WeakReference<Bitmap> mWeakBitmap;    public MyRelativeLayout(Context context) {        super(context);        sharedConstructor(context);    }    public MyRelativeLayout(Context context, AttributeSet attrs) {        super(context, attrs);        sharedConstructor(context);    }    public MyRelativeLayout(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        sharedConstructor(context);    }    private void sharedConstructor(Context context) {        mContext = context;        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);    }    public void invalidate() {        mWeakBitmap = null;        if (mMaskBitmap != null) {            mMaskBitmap.recycle();        }        super.invalidate();    }    @Override    protected void onDraw(Canvas canvas) {        Log.i(TAG,"onDraw......");        if (!isInEditMode()) {            int i = canvas.saveLayer(0.0f, 0.0f, getWidth(), getHeight(), null,                    Canvas.ALL_SAVE_FLAG);            try {                Bitmap bitmap = mWeakBitmap != null ? mWeakBitmap.get() : null;                // Bitmap not loaded.                if (bitmap == null || bitmap.isRecycled()) {                    Drawable drawable = getDrawable();                    if (drawable != null) {                        // Allocation onDraw but it's ok because it will not                        // always be called.                        bitmap = Bitmap.createBitmap(getWidth(), getHeight(),                                Bitmap.Config.ARGB_8888);                        Canvas bitmapCanvas = new Canvas(bitmap);                        drawable.setBounds(0, 0, getWidth(), getHeight());                        drawable.draw(bitmapCanvas);                        // If mask is already set, skip and use cached mask.                        if (mMaskBitmap == null || mMaskBitmap.isRecycled()) {                            mMaskBitmap = createMask1();                        }                        // Draw Bitmap.                        mPaint.reset();                        mPaint.setFilterBitmap(false);                        mPaint.setXfermode(sXfermode);                        // mBitmapShader = new BitmapShader(mMaskBitmap,                        // Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);                        // mPaint.setShader(mBitmapShader);                        bitmapCanvas                                .drawBitmap(mMaskBitmap, 0.0f, 0.0f, mPaint);                        mWeakBitmap = new WeakReference<Bitmap>(bitmap);                    }                }                // Bitmap already loaded.                if (bitmap != null) {                    mPaint.setXfermode(null);                    // mPaint.setShader(null);                    canvas.drawBitmap(bitmap, 0.0f, 0.0f, mPaint);                    return;                }            } catch (Exception e) {                System.gc();            } finally {                canvas.restoreToCount(i);            }        } else {            super.onDraw(canvas);        }    }    public Bitmap createMask1() {        Log.i(TAG,"createMask1......");        mWidth = getWidth();        mHeight = getHeight();        Bitmap.Config localConfig = Bitmap.Config.ARGB_8888;        Bitmap localBitmap = Bitmap.createBitmap(mWidth, mHeight, localConfig);        Canvas localCanvas = new Canvas(localBitmap);// 产生一个相同的画布        Paint localPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        localPaint.setAntiAlias(true);        //随意设置颜色值,没有作用        localPaint.setColor(Color.WHITE);                float xL = lastTouchX - firstTouchX;        float yL = lastTouchY - firstTouchY;        //控制透明部分的透明度        Log.i("wyn_layout","mHeight :"+mHeight+"  lastTouchY:"+lastTouchY);        float alpha = Math.abs(xL)/3;        Log.i("wyn_layout","alpha = "+alpha+" xL = "+xL);//        alpha = Math.abs(alpha);        localPaint.setColor(Color.TRANSPARENT);        localPaint.setAlpha((int)alpha);                float r = 0;        if(xL > 0){            //自定义透明部分图形            // p.setColor(Color.BLUE);   扇形    //        RectF oval2 = new RectF(0, lastTouchY, lastTouchX, mHeight);// 设置个新的长方形,扫描测量      //        localCanvas.drawArc(oval2, 0, 90, true, localPaint);            if(lastTouchY != 0){                        r = (float)(Math.sqrt(((xL * xL) + (yL * yL))) + (1.1 * mWidth));            }                        Log.i("wyn_layout","drawCircle r:"+r);            localCanvas.drawCircle(-mWidth, mHeight, r, localPaint);                    }else if(xL < 0){//            float r = 0;            if(lastTouchY != 0){                        r = (float)(Math.sqrt(((xL * xL) + (yL * yL))) + (1.1 * mWidth));            }                        Log.i("wyn_layout","drawCircle r:"+r);            localCanvas.drawCircle((2*mWidth), mHeight, r, localPaint);                    }        ((MainActivity) mContext).moveViewByLayout((int)Math.abs(xL));                return localBitmap;    }            @Override    public boolean onTouchEvent(MotionEvent event) {    // TODO Auto-generated method stub        if (event.getAction() == MotionEvent.ACTION_DOWN) {            firstTouchY = event.getY();            firstTouchX = event.getX();        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {            lastTouchX = event.getX();            lastTouchY = event.getY();            postInvalidate();        } else if (event.getAction() == MotionEvent.ACTION_UP) {            lastTouchX = 0;            lastTouchY = 0;            postInvalidate();            firstTouchX = 0;            firstTouchY =0;        }        // 必须为true,否则无法获取ACTION_MOVE及ACTION_UP事件        return true;    }    }


MainActiviry:

import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.os.Bundle;import android.util.Log;import android.view.Display;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.Window;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView;public class MainActivity extends Activity {        private RelativeLayout mTextLayout;    private TextView mTime;    private int beginTop = 0;    private int beginBottom = 0;        @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                mTextLayout = (RelativeLayout) findViewById(R.id.textLayout);        mTime = (TextView)findViewById(R.id.time);    }        @Override    public void onWindowFocusChanged(boolean hasFocus) {        // TODO Auto-generated method stub        beginTop = mTextLayout.getTop();        beginBottom = mTextLayout.getBottom();        super.onWindowFocusChanged(hasFocus);    }        public RelativeLayout getTextLayout(){        return mTextLayout;    }        /**     * 通过layout方法,移动view      * 优点:对view所在的布局,要求不苛刻,不要是RelativeLayout,而且可以修改view的大小     *      * @param view     * @param rawX     * @param rawY     */    public void moveViewByLayout(int distance) {        int left = mTextLayout.getLeft();        int top = beginTop + distance;        int right = left + mTextLayout.getWidth();        int bottom = beginBottom;        Log.i("wyn_layout_MainActivity","moveViewByLayout top = "+top+" bottom = "+bottom+" distance = "+distance);        mTextLayout.layout(left, top, right, bottom);    }        //    public void moveViewByLayout(View view, int rawX, int rawY) {//        int left = rawX - ivMove.getWidth() / 2;//        int top = rawY - topTitleHeight - ivMove.getHeight() / 2;//        int right = left + view.getWidth();//        int bottom = top + view.getHeight();//        view.layout(left, top, right, bottom);//    }}


0 0
原创粉丝点击