锁屏效果

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

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

代码如下:参考了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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值