锁屏效果

news/2024/10/17 16:26:16/

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

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

代码如下:参考了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);
//    }
}



http://www.ppmy.cn/news/462071.html

相关文章

锁屏界面

锁屏的代码在 /frameworks/polices/bases/phone/com/android/internal/policy/impl/LockScreen.java 可以设置锁屏功能开关的代码位于&#xff1a; frameworks/policies/base/phone/com/android/internal/policy/impl/LockPatternKeyguardView /738 packages\apps\Settings\A…

电脑 ctf占用过高

这样会导致键盘输入反应慢 方法&#xff1a; 下载个别的输入法&#xff0c;然后把微软自带的输入法全部删了。

CTF占用CPU过高是创建bat文件贴下双击无需重启

del %USERPROFILE%\AppData\Roaming\Microsoft\InputMethod\Chs*.tmp

“程序已停止工作”问题的解决方法

“程序已停止工作”问题的解决方法 参考文章&#xff1a; &#xff08;1&#xff09;“程序已停止工作”问题的解决方法 &#xff08;2&#xff09;https://www.cnblogs.com/447367342/p/4375752.html 备忘一下。

win10升级后CFT加载程序占用CPU高解决办法

win10升级后CFT加载程序占用CPU高&#xff0c;目前网上的解释是微软BUG&#xff0c;需要待后续版本解决&#xff0c;CPU持续占用较高&#xff0c;干不了其它事情&#xff0c;可以用如下方法解决。 用windows进程管理杀死后&#xff0c;由于此进程会自动启动非常顽固&#xff0c…

CTF baby_web

题目描述&#xff1a;想想初始页面是哪个 题目场景&#xff1a; http://220.249.52.133:49388 &#xff08;温馨提示&#xff1a;每次进入URL的端口号都不一样&#xff09; 1、点击链接进入如下界面 2、URL&#xff1a;把“1.php”为“index.php”—>回车 3、查看源代码&…

CTF 你就是长不了

题目描述&#xff1a; 其实很多时候&#xff0c;你即使可以输入了&#xff0c;你也输入不长。但是&#xff0c;我们不服&#xff01;怎么办呢&#xff1f;(答案为flag{}形式&#xff0c;提交{}中内容即可) 1、点击输入183.129.189.60:10019 2、查看代码 3、maxlength"10&…

CTF Just-No-One

难度系数&#xff1a; ★★★★ 题目附件&#xff1a; 附件1 1、附件1 链接&#xff1a;https://pan.baidu.com/s/1IB2R0XDKyYBnKX2kCIRFjQ 提取码&#xff1a;8zkt 2、文件&#xff08;一个应用程序&#xff09; 3、解题 吐槽&#xff1a; 这题的flag很难找&#xff0c;要…