android 绘图 双缓存,Android开发之用双缓冲技术绘图
双缓冲技术主要用在画图,动画效果上。其原理就是:将资源先载入到缓冲区,然后再将缓冲区整个载入到View上面去。
双缓冲技术可以有效防止闪烁。提高显示质量。
DrawView.java:
package com.example.handdraw;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
publicclassDrawView
extendsView{
floatpreX;
floatpreY;
private Path path;
public Paint paint = null;
final int
VIEW_WIDTH = 720;
finalintVIEW_HEIGHT= 800;
//定义一个内存中的图片,该图片将作为缓冲区
Bitmap cacheBitmap = null;
//定义cacheBitmap上的Canvas对象
Canvas cacheCanvas = null;
public DrawView(Context context ,AttributeSet set) {
super(context, set);
// TODO Auto-generated constructor stub
//创建一个与该View同样大小的缓冲区
cacheBitmap= Bitmap.createBitmap(VIEW_WIDTH,VIEW_HEIGHT, Config.ARGB_8888);
cacheCanvas = new Canvas();
path = new Path();
//设置cacheCanvas将会绘制到内存中的cacheBitmap上
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);
}
@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();
//表明处理方法已经处理改事件
returntrue;
}
@Override
protected void onDraw(Canvas canvas) {
Paint bmpPaint = new Paint();
//将cacheBitmap绘制到该View组件上
canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint);
//沿着path绘制
canvas.drawPath(path,
paint);
}
}
my_menu.xml:
>
>
Activity.java:
package com.example.handdraw;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.BlurMaskFilter;
import android.graphics.Color;
import android.graphics.EmbossMaskFilter;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
public class MainActivity extends Activity {
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) {
// Inflate the menu; this adds items to the action bar if it is present.
MenuInflater inflator = new MenuInflater(this);
inflator.inflate(R.menu.my_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
DrawView dv = (DrawView)findViewById(R.id.draw);
switch(item.getItemId())
{
case R.id.red:
dv.paint.setColor(Color.RED);
item.setChecked(true);
break;
case R.id.green:
dv.paint.setColor(Color.GREEN);
item.setChecked(true);
break;
case R.id.blue:
dv.paint.setColor(Color.BLUE);
item.setChecked(true);
break;
case R.id.width_1:
dv.paint.setStrokeWidth(1);
break;
case R.id.width_3:
dv.paint.setStrokeWidth(3);
break;
case R.id.width_5:
dv.paint.setStrokeWidth(5);
break;
case R.id.blur:
dv.paint.setMaskFilter(blur);
break;
case R.id.emboss:
dv.paint.setMaskFilter(emboss);
break;
}
return true;
}
}
main.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
android:id="@+id/draw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"/>
android 绘图 双缓存,Android开发之用双缓冲技术绘图相关推荐
- android 清空数组缓存,Android数据持久化之读写SD卡中内容的方法详解
本文实例讲述了Android数据持久化之读写SD卡中内容的方法.分享给大家供大家参考,具体如下: 前面文章里讲的那三个方法:openFileOutput.openFileInput虽然都能通过流对象O ...
- android内核网络缓存,Android WebView cache 缓存 腾讯X5内核在线视频播放
[实例简介] Android WebView cache 缓存 腾讯X5内核在线视频播放 [实例截图] [核心代码] Terry007 └── Terry007 ├── AndroidManifest ...
- java双缓冲绘图_Java双缓冲技术-绘图应用
1屏幕产生闪烁的原因 由于在显示所绘制的图像时,调用了repaint方法.repaint方法被调用时,需要清除整个背景,然后才调用paint方法显示画面.这样,在清除背景和绘制图像的短暂时间间隔内被用 ...
- android 清除所有缓存,Android一键清除所有应用的缓存
最近有一个需求,需要在最近任务页面的一键清除任务按钮中添加一键清除页面缓存的功能,网上找了一圈,看不到什么便捷的版本,基本上是遍历xxx/cache然后删除,其实是没有这个必要的. 模仿:想一想,哪里 ...
- android http请求缓存,Android Http请求和响应使用协议缓冲区
我对协议缓冲区主题非常陌生. 但我知道json解析等等 现在,我实际上正在此协议缓冲区上工作,我正在制作一个使用带有协议缓冲区的android进行Http请求和响应的应用程序. 我正在使用androi ...
- android picasso 三级缓存,Android中图片的三级缓存浅析
图片的三级缓存机制一般是指应用加载图片的时候,分别去访问内存,文件和网络而获取图片数据的一种行为.以下内容只是简单的介绍了三级缓存的思想和大致流程,还有很多细节未进行处理,如果想深入研究可以在Gith ...
- android webview 关闭缓存,Android WebView删除缓存
1.删除保存于手机上的缓存// clear the cache before time numDays private int clearCacheFolder(File dir, long numD ...
- android 清除布局缓存,android – RecyclerView:如何清除缓存/回收视图?
我使用RecyclerView显示列表布局的项目列表.我从列表布局切换到网格布局,在网格布局中只显示所有数据的一个子集.该交换机使用不同于布局列表的布局 XML. 所有这一切都很好,除了当我滚动,回收 ...
- android蓝牙指令缓存,Android 蓝牙缓存清理
有时候在固件调试时会修改蓝牙设备的名字,然后在搜索蓝牙设备的时候,偶尔发现有那么几个修改过名字的设备,显示的时候还是改名前的设备名,这就很郁闷了......问题应该是蓝牙名字被修改了,但是mac地址并 ...
最新文章
- 解决ie6、7 margin-bottom 失效问题
- 全球最厉害的 14 位程序员,请收下我的膝盖
- ios中播放gif动画
- 那些方式可以合并php数组,php中数组合并的几种方法
- 每日一题(26)—— 无限循环的几种形式
- AI时代学习新的技术,方向为计算机视觉--欢迎来我的简书blog拔草
- 麦肯锡:全球调研14个行业、160个案例、3000名高管,AI应用到哪一步了?
- CMakeLists写法总结
- 2018年个人学习计划总结
- 北京圣思园视频下载及时跟新
- 【窗体控件】:Button按钮控件
- 蓄水池采样 Reservoir Sampling
- 2019辽宁公务员考试申论模拟题:网络直播发展存在的多重难题
- AI“文化宴”,易碎的市场寻求新的突破
- 何为用友云及浅谈云原生
- 达内java开发软件怎么装,达内培训专家告诉你8个有用的Java开发工具
- Unity预制件Prefab Day04
- Win10 系统不使用软件设置状态栏透明效果
- QT QImage显示图片后缀问题,不能显示图片(Image is a null image)
- R语言排名第8 | 2020 年 7 月编程语言排行榜
热门文章
- python查看opencv版本命令行_查看python下OpenCV版本的方法
- jsp访问java方法_JSP基础知识之访问JavaBean的方法
- oracle创建表时创建序列号,oracle表中怎么建序列
- php受保护的成员方法,PHP继承和受保护的成员可见性
- java装饰模式模拟流_Java 装饰模式 io流
- blob jdbc mysql,JDBC能否处理Blob和Clob?
- python建站部署_SpringBoot入门建站全系列(三十二)接入xxl-job分布式任务调度平台...
- 【thymeleaf】th:with
- JNDI配置DataResource代替JDBC连接数据库
- oracle服务未启动失败,windows服务未启动导致 ORA-12560和RMAN-00554错误 | 信春哥,系统稳,闭眼上线不回滚!...