锁屏效果
来源:互联网 发布:武侠台词 知乎 编辑:程序博客网 时间: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
- 锁屏效果
- 界面遮罩(锁屏效果)
- Android界面篇【锁屏效果】
- 仿QQ锁屏界面效果
- 自定义控件实现锁屏效果!
- 闪屏效果
- 实现闪屏效果
- U3D 震屏效果
- Camera震屏效果
- Android碎屏效果
- 截屏效果实现
- 闪屏效果splash
- 滑屏效果实现
- 效果
- 效果
- Android UI开发第十篇——锁屏效果
- 项目经验 jsp页面锁屏正在加载的效果
- 关于Cosmos上特殊锁屏效果的实现
- CEF Xilium.CefGlue 防止浏览器闪退
- (网络视频监控)面试题12
- 交互模式下python自动补全
- Remove Duplicates from Sorted Array
- linux常用命令
- 锁屏效果
- 高阶函数 Higher-order function
- [UVA400]Unix ls[格式输出]
- Java NIO原理图文分析及代码实现
- C# 之 string字符串
- Divisibility by Eight
- POJ 2752 Seek the Name, Seek the Fame(KMP)
- Unity退出后保存数据,PlayerPrefs 玩家偏好
- 第五天 类和对象