Android(安卓)双缓冲 使用 示例
16lz
2021-12-04
本文参考文献:《疯狂Android讲义(第2版)》
自定义视图:
package com.toby.personal.testlistview;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.MaskFilter;import android.graphics.Paint;import android.graphics.Path;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;/** * Created by toby on 2017/4/10. */public class DrawView extends View { private final static int VIEW_WIDTH = 720; private final static int VIEW_HEIGHT = 1280; private float preX; private float preY; private Path path; private Paint paint = null; private Paint bmpPaint = null; private Bitmap cacheBitmap = null; private Canvas cacheCanvas = null; public DrawView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH, VIEW_HEIGHT, Bitmap.Config.ARGB_8888); cacheCanvas = new Canvas(); path = new Path(); cacheCanvas.setBitmap(cacheBitmap); paint = new Paint(Paint.DITHER_FLAG); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(1); paint.setAntiAlias(true); paint.setDither(true); bmpPaint = new Paint(); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: path.moveTo(x, y); preX = x; preY = y; break; case MotionEvent.ACTION_MOVE: path.quadTo(preX, preY, x, y); preX = x; preY = y; break; case MotionEvent.ACTION_UP: cacheCanvas.drawPath(path, paint); path.reset(); break; } invalidate(); return true; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint); canvas.drawPath(path, paint); } public void setColor(int color){ paint.setColor(color); } public void setStrokeWidth(float width){ paint.setStrokeWidth(width); } public void setMaskFilter(MaskFilter maskFilter){ paint.setMaskFilter(maskFilter); }}
自定义 menu 资源文件:
<?xml version="1.0" encoding="utf-8"?>
主布局文件的内容:
<?xml version="1.0" encoding="utf-8"?>
主程序文件的内容:
package com.toby.personal.testlistview;import android.graphics.BlurMaskFilter;import android.graphics.Color;import android.graphics.EmbossMaskFilter;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;public class MainActivity extends AppCompatActivity { final private static String TAG = "Toby_Test"; EmbossMaskFilter emboss; BlurMaskFilter blur; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); emboss = new EmbossMaskFilter(new float[]{1.5f, 1.5f, 1.5f}, 0.6f, 6, 4.2f); blur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = new MenuInflater(this); inflater.inflate(R.menu.test_menu01, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { DrawView drawView = (DrawView) findViewById(R.id.drawView); switch (item.getItemId()){ case R.id.red: drawView.setColor(Color.RED); item.setChecked(true); break; case R.id.green: drawView.setColor(Color.GREEN); item.setChecked(true); break; case R.id.blue: drawView.setColor(Color.BLUE); item.setChecked(true); break; case R.id.width_1: drawView.setStrokeWidth(1); break; case R.id.width_3: drawView.setStrokeWidth(3); break; case R.id.width_5: drawView.setStrokeWidth(5); break; case R.id.blur: drawView.setMaskFilter(blur); break; case R.id.emboss: drawView.setMaskFilter(emboss); break; } return true; }}
运行效果:
显示效果更多相关文章
- NPM 和webpack 的基础使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
- Android——SimpleExpandableListAdapter(收集)
- 关于havlenapetr-FFMpeg在Android(安卓)4.0(ICS)的补充说明
- android 获取服务器json数据
- android调用本地录制程序获取录制文件路径的问题
- [Linux] 批量查看Android应用程序的文件名称;
- android清除缓存并获取大小
- 【Android】利用广播Broadcast接收SMS短信