Bitmap的基础综合
来源:互联网 发布:手机淘宝联盟自动发单 编辑:程序博客网 时间:2024/05/05 13:05
星期五竟然调课了,挺好的 连着三天不用上课,然后就接着学习Android 第九章,放假之前把它得结束了。
今天星期一,把这个周末写的综合一下就一起写了吧。
这几篇代码重复性很大 ,一会再说吧。。。
1.先看看旋转
1.1先把布局文件写出来 (下面的Demo都是一样的,就不重复写的)
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/frameLayout" android:layout_width="match_parent" android:layout_height="match_parent"></FrameLayout></span>
1.2 就写一个MainActivity类就行
<span style="color:#660000;">package com.example.hejingzhou.matrixdemo;</span><span style="font-size:18px;color:#336666;">import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.FrameLayout;public class MainActivity extends AppCompatActivity { private FrameLayout frameLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); frameLayout = (FrameLayout)findViewById(R.id.frameLayout); frameLayout.addView(new MainView(this)); } public class MainView extends View { public MainView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); //Bitmap工厂 资源解码 Bitmap bitmap_backImage = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.cao); canvas.drawBitmap(bitmap_backImage, 0, 0, paint);//绘制背景图片(草原) Bitmap bitmap_rabbit = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.tu); canvas.drawBitmap(bitmap_rabbit,0,0,paint);//绘制原图(小兔子) //利用 Matrix matrix = new Matrix(); matrix.setRotate(30);//设置旋转(以(0,0)点为轴心旋转30度) </span><span style="font-size:18px;color:#cc0000;">其实都是为这句服务的</span><span style="font-size:18px;color:#336666;"> canvas.drawBitmap(bitmap_rabbit, matrix, paint);//绘制并应用matrix的变换// Matrix m = new Matrix();// m.setRotate(90,87,87);// canvas.drawBitmap(bitmap_rabbit,m,paint); super.onDraw(canvas); } }}</span><span style="color:#660000;"></span>
1.3效果
2、图形倾斜
2.1布局和上一个一样,不写了,ActivityJava代码也基本一样,就是MyView类中的onDraw方法区别
<span style="font-size:18px;color:#336666;">protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setAntiAlias(true); Bitmap bitmap_backImage = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.cao); canvas.drawBitmap(bitmap_backImage,0, 0, paint);// Bitmap bitmap_rabbit = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.tu); Matrix matrix_1 = new Matrix(); matrix_1.setSkew(2f,2f,50f,30f);//设置倾斜 canvas.drawBitmap(bitmap_rabbit, matrix_1, paint);//绘制图像并应用Matrix Matrix matrix_2 = new Matrix(); matrix_2.setSkew(-0.5f,0f,69,78); canvas.drawBitmap(bitmap_rabbit,matrix_2,paint); //canvas.drawBitmap(bitmap_rabbit,0,0,paint);//原图 super.onDraw(canvas); }</span>
2.2效果
3、位图的平移
3.1布局文件一样 onDraw 方法不同
<span style="font-size:18px;">protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setAntiAlias(true); Bitmap bitmap_backImage = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.cao); canvas.drawBitmap(bitmap_backImage, 0, 0, paint); Bitmap bitmap_rabbit = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.tu); canvas.drawBitmap(bitmap_rabbit,0,0,paint);//原图 Matrix matrix_1 = new Matrix(); //matrix_1.setRotate(30);//设置旋转 matrix_1.postTranslate(800,200);//将matrix_1平移到(100,50)的位置 post平移 canvas.drawBitmap(bitmap_rabbit,matrix_1,paint); super.onDraw(canvas); }</span>
3.2效果
4、位图缩放
4.1布局文件一样 onDraw 方法不同
<span style="font-size:18px;"> protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setAntiAlias(true); Bitmap bitmap_backImage = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.cao); canvas.drawBitmap(bitmap_backImage, 0, 0, paint);//设置背景图片 Bitmap bitmap_rabbit = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.tu); Matrix matrix_2 = new Matrix(); matrix_2.setScale(0.8f, 0.8f, 250, 800);//以(156,156)为轴心将图像在X轴和Y轴上均缩放80% canvas.drawBitmap(bitmap_rabbit,matrix_2,paint); //canvas.drawBitmap(bitmap_rabbit,0,0,paint);不经任何变化的图像 Matrix matrix_0 = new Matrix(); matrix_0.setScale(1.5f,1.5f,-730,-250); canvas.drawBitmap(bitmap_rabbit, matrix_0, paint); Matrix matrix_1 = new Matrix(); matrix_1.setScale(2f,2f);//以(0,0点为轴心将图像在X轴和Y轴上均缩放200%) canvas.drawBitmap(bitmap_rabbit, matrix_1, paint); super.onDraw(canvas); }</span>
4.2效果
5、图片的平铺Mode
5.1这个布局文件一样,Activity就不太同了,这是是需要获取当前屏幕的长宽
<span style="color:#660000;">package com.example.hejingzhou.bitmapshder_1;</span><span style="font-size:14px;"><span style="color:#3333ff;">import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Shader;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.FrameLayout;public class MainActivity extends AppCompatActivity { private int view_width; private int view_height; private FrameLayout frameLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); frameLayout = (FrameLayout)findViewById(R.id.frameLayout); frameLayout.addView(new MyView(this)); } public class MyView extends View { public MyView(Context context) { super(context); </span><span style="color:#ff0000;">view_height = context.getResources().getDisplayMetrics().heightPixels; view_width = context.getResources().getDisplayMetrics().widthPixels;</span><span style="color:#3333ff;"> } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setAntiAlias(true); Bitmap bitmap_backimage = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.hua1); BitmapShader bitmapShader_1 = new BitmapShader(bitmap_backimage, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); /**BitmapShader API: * Call this to create a new shader that will draw with a bitmap. * * @param bitmap The bitmap to use inside the shader * @param tileX The tiling mode for x to draw the bitmap in. * @param tileY The tiling mode for y to draw the bitmap in. * */// /**// * replicate the edge color if the shader draws outside of its// * original 边缘颜色// */// CLAMP (0),// /**// * repeat the shader's image horizontally and vertically横向和纵向重复着色的图像 平铺// */// REPEAT (1),// /**// * repeat the shader's image horizontally and vertically, alternating// * mirror images so that adjacent images always seam横向和纵向重复着色器的图像,交/图·镜像,使相邻图像总是缝// */// MIRROR (2); paint.setShader(bitmapShader_1);//设置渲染对象 canvas.drawRect(0, 0, view_width,view_height, paint);//绘制一个矩形 Bitmap bitmap_2 = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.hua2); BitmapShader bitmapShader_2 = new BitmapShader(bitmap_2, Shader.TileMode.REPEAT, Shader.TileMode.MIRROR); paint.setShader(bitmapShader_2); RectF over = new RectF(0,0,280,180);//浮点矩形 canvas.translate(40,20);//在画面上X轴上平移40像素,在Y轴上平移20像素 /*** * Matrix.postTranslate(40,20) * canvar.translate(40,20) 什么区别?????? */ canvas.drawOval(over,paint); super.onDraw(canvas); } }}</span><span style="color:#660000;"></span></span>
5.2参数不同效果展示 平铺 镜面
6、图形的圆角化
6.1布局一样 Java如下
<span style="color:#663366;">package com.example.hejingzhou.bitmapshader_2;<span style="font-size:18px;">import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Shader;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.FrameLayout;public class MainActivity extends AppCompatActivity {private FrameLayout frameLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); frameLayout = (FrameLayout)findViewById(R.id.frameLayout); frameLayout.addView(new MyView(this)); frameLayout.setBackgroundColor(Color.rgb(205,198,73)); } public class MyView extends View { public MyView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setAntiAlias(true);// Bitmap bitmap_1 = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.backimage);// canvas.drawBitmap(bitmap_1,0,0,paint);?????????为啥错呢!! RectF rectF_1 = new RectF(0,0,980,780); canvas.translate(40, 40);//平移向下 paint.setStyle(Paint.Style.STROKE);//设置填充样式为描边 paint.setColor(Color.RED); paint.setStrokeWidth(10); // 绘制圆形的矩形方法 canvas.drawRoundRect(rectF_1, 40, 40, paint);//绘制一个描边的圆形矩形 paint.setStyle(Paint.Style.FILL_AND_STROKE);//设置填充样式为填充 Bitmap bitmap_mainImage = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.gou); BitmapShader bitmapShader_main = new BitmapShader(bitmap_mainImage, Shader.TileMode.REPEAT, Shader.TileMode.MIRROR); paint.setShader(bitmapShader_main); canvas.drawRoundRect(rectF_1,40,40,paint); super.onDraw(canvas); } }}</span></span><span style="color:#660000;"></span>
6.2参数不同效果不同
7、这个用Android studio 开发时 出了一个错 就是Matrix类下过时了,按说能用但是方法确报错。后来只能用Eclipse做了。
Android Studio开发时产生这样的,问了一圈,不知道为什么。
??????????????????????????????????????????????
这次是做了单独的做了一个MyView 类
7.1 先看看这个MyView 类吧 还是它重要
package com.example.magnifying;<span style="font-size:18px;">import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Shader.TileMode;import android.graphics.drawable.ShapeDrawable;import android.graphics.drawable.shapes.OvalShape;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;public class MyView extends View {private Bitmap bitmap;private ShapeDrawable drawable;private final int BANJING = 57;private final int BEISHU = 3;private Matrix matrix = new Matrix();private Bitmap bitmap_fangdajing;//放大的位图private int m_left = 0;//放大镜的左边距private int m_top = 0;//放大镜的上下边距public MyView(Context context) {super(context);Bitmap bitmap_backImage = BitmapFactory.decodeResource(getResources(), R.drawable.source);//需要放大图像bitmap = bitmap_backImage;/* * 整个“放大”核心 * */BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(bitmap_backImage,bitmap_backImage.getWidth()*BEISHU,bitmap_backImage.getHeight()*BEISHU,true),TileMode.CLAMP,TileMode.CLAMP);/* * createScaledBitmap在原来的位图基础创建一个新的位图 * 参数 * The source bitmap. 源位图 ----BackImage * The new bitmap's desired width. 新的位图所需的宽度。 * The new bitmap's desired height. 新的位图所需的高度。 * 如果源筛选 就写true。 * *//*public BitmapShader(Bitmap bitmap,Shader.TileMode tileX,Shader.TileMode tileY)调用这个方法来产生一个画有一个位图的渲染器(Shader)。bitmap 在渲染器内使用的位图tileX The tiling mode for x to draw the bitmap in. 在位图上X方向花砖模式tileY The tiling mode for y to draw the bitmap in. 在位图上Y方向花砖模式TileMode:(一共有三种)CLAMP :如果渲染器超出原始边界范围,会复制范围内边缘染色。REPEAT :横向和纵向的重复渲染器图片,平铺。MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT 重复方式不一样,他是以镜像方式平铺。*//*绘制一个椭圆形 * */drawable = new ShapeDrawable(new OvalShape());drawable.getPaint().setShader(shader);//设置渲染器drawable.setBounds(0, 0, BANJING*2,BANJING*2);//设置圆外切的矩形bitmap_fangdajing = BitmapFactory.decodeResource(getResources(), R.drawable.magnifier);//获取放大镜的图像m_left = BANJING - bitmap_fangdajing.getWidth()/2;//计算放大镜的左右边距m_top = BANJING - bitmap_fangdajing.getHeight()/4;//计算放大镜的上下边距}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);canvas.drawBitmap(bitmap, 0,0,null);//画背景canvas.drawBitmap(bitmap_fangdajing,m_left,m_top,null);//绘制放大镜drawable.draw(canvas);}/* * 触摸放大镜移动 * */@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubfinal int x = (int)event.getRawX();final int y = (int)event.getRawY();matrix.setTranslate(BANJING - x*BEISHU, BANJING-y*BEISHU);//设置远的外切矩形drawable.getPaint().getShader().setLocalMatrix(matrix);drawable.setBounds(x-BANJING,y-BEISHU,x+BANJING,y+BANJING);m_left = x - bitmap_fangdajing.getWidth()/2;m_top = y - bitmap_fangdajing.getHeight()/2;invalidate();return true;} }</span>
7.2 MainActivity
<span style="color:#990000;">package com.example.magnifying;</span><span style="font-size:18px;color:#cc33cc;">import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.FrameLayout;public class MainActivity extends Activity {private FrameLayout frameLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); frameLayout = (FrameLayout)findViewById(R.id.frameLayout); frameLayout.addView(new MyView(this)); } }</span><span style="color:#990000;"></span>
7.3效果
综合源代码: http://download.csdn.net/detail/csdnhejingzhou/9355255
0 0
- Bitmap的基础综合
- 综合基础
- Bitmap基础
- 链表的实战讲解(综合以前的基础)
- 数据库基础综合
- WinForm基础:综合练习
- 【Linux基础】综合应用
- 计算机学科专业基础综合
- 计算机专业基础综合
- java基础 - 综合训练
- java基础综合练习
- 一个比较综合的Java语言基础试题
- 一个比较综合的Java语言基础试题
- 一个比较综合的Java语言基础试题
- 一个比较综合的Java语言基础试题
- 一个比较综合的Java语言基础试题
- 一个比较综合的Java语言基础试题
- 一个比较综合的Java语言基础试题
- 在手机相册(ios设备相册)中创建相册
- 解决android上java.net.UnknownHostException: Unable to resolve host "xxxx"
- JAVA虚拟机之三:CMS垃圾收集器
- 欢迎使用CSDN-markdown编辑器
- 2015年大二上-数据结构-数组与广义表(2)-2.压缩存储的对称矩阵的运算
- Bitmap的基础综合
- 纯代码实现cell嵌套cell
- Sublime Text 无法使用Package Control或插件安装失败的解决方法
- Redis 存储JavaBean对象(默认是不支持的,只能让该javabean继承序列化接口实现)
- CentOS 7.1安装GNOME,开启VNC Server
- Git 远程服务器搭建
- 如何计算任意两分数
- IOS开发之NSDictionary里setValue:forKey与setObject:forKey、objectForKey与valueForKey的差异
- CenOS6.x 下Twisted安装