先提一下Draw 9-patch
老版本的Android Studio是在SDK目录下的Tools里有个draw9patch

新版Android Studio是可以在AS里直接创建的(一开始没在目录下找到我也是一脸懵逼)

与传统的png格式图片相比,9.png格式图片在图片四周有一圈一个像素点组成的边沿,该边沿用于对图片的可扩展区和内容显示区进行定义。这种格式的图片在android环境下具有自适应调节大小的能力。
给.9图片划线,指的是通过划线,决定图片的可拉伸区域和显示文本信息的区域。其中,上方和左方的线是控制图片的可拉伸区域的,也就是说,上方的线控制图片横向可拉伸,左侧的线控制纵向可拉伸。下方的线和右侧的线控制图片的文本区域,也就是说,如果图片上有text,就会把位置控制在下方和右侧的线围成的区域里、如果想删除划线,安卓shift+鼠标左键,删除划线。

用画布画一个图片

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.View;public class MyImageView extends View {public MyImageView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint p=new Paint();Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.x);canvas.drawBitmap(bitmap,0,0,p);}
}
setContentView(new MyImageView(this));


画2d图形

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Shader;
import android.os.Parcel;
import android.view.View;/*** 自定义一个组件*/
public class MyView extends View {public MyView(Context context) {super(context);}//会在组件加载时调用@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.WHITE);Paint paint=new Paint();//去锯齿paint.setAntiAlias(true);//设置paint的颜色paint.setColor(Color.RED);//设置paint的style为STROKE:空心paint.setStyle(Paint.Style.STROKE);//设置paint的外框宽度paint.setStrokeWidth(3);//画一个空心圆形//参数:圆心X,圆心Y,半径r,paintcanvas.drawCircle(40,40,30,paint);//画一个空心正方形//参数:left top right bottom,当right-left等于bottom-top就为正方形canvas.drawRect(10,90,70,150,paint);//画一个空心长方形canvas.drawRect(10,170,70,200,paint);//画一个空心椭圆形RectF re=new RectF(10,220,70,250);canvas.drawOval(re,paint);//画一个空心三角形Path path=new Path();path.moveTo(10,330);path.lineTo(70,330);path.lineTo(40,270);path.close();canvas.drawPath(path,paint);//画一个空心梯形Path path1=new Path();path1.moveTo(10,410);path1.lineTo(70,410);path1.lineTo(55,350);path1.lineTo(25,350);path1.close();canvas.drawPath(path1,paint);//设置paint的style为FILL:实心paint.setStyle(Paint.Style.FILL);//设置paint的颜色paint.setColor(Color.BLUE);//画一个实心圆canvas.drawCircle(120,40,30,paint);//画一个实心正方形canvas.drawRect(90,90,150,150,paint);//画一个实心长方形canvas.drawRect(90,170,150,200,paint);//画一个实心椭圆RectF re2=new RectF(90,220,150,250);canvas.drawOval(re2,paint);//画一个实心三角形Path path2=new Path();path2.moveTo(90,330);path2.lineTo(150,330);path2.lineTo(120,270);path2.close();canvas.drawPath(path2,paint);//画一个实心梯形Path path3=new Path();path3.moveTo(90,410);path3.lineTo(150,410);path3.lineTo(135,350);path3.lineTo(105,350);path3.close();canvas.drawPath(path3,paint);//设置渐变色Shader mShader=new LinearGradient(0,0,100,100,new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW},null,Shader.TileMode.REPEAT);paint.setShader(mShader);//画一个渐变色圆canvas.drawCircle(200,40,30,paint);//画一个渐变色正方形canvas.drawRect(170,90,230,150,paint);//画一个渐变色长方形canvas.drawRect(170,170,230,200,paint);//画一个渐变色椭圆RectF re3=new RectF(170,220,230,250);canvas.drawOval(re3,paint);//画一个渐变色三角形Path path4=new Path();path4.moveTo(170,330);path4.lineTo(230,330);path4.lineTo(200,270);path4.close();canvas.drawPath(path4,paint);//画一个渐变色梯形Path path5=new Path();path5.moveTo(170,410);path5.lineTo(230,410);path5.lineTo(215,350);path5.lineTo(185,350);path5.close();canvas.drawPath(path5,paint);//写字paint.setTextSize(24);canvas.drawText("圆形",240,50,paint);canvas.drawText("正方形",240,120,paint);canvas.drawText("长方形",240,190,paint);canvas.drawText("椭圆形",240,250,paint);canvas.drawText("三角形",240,320,paint);canvas.drawText("梯形",240,390,paint);}
}
setContentView(new MyView(this));


SurfaceView
单独在自己的窗口绘制

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {private SurfaceHolder holder;private MyThread thread;public MySurfaceView(Context context) {super(context);holder=this.getHolder();holder.addCallback(this);}class MyThread implements Runnable{private SurfaceHolder holder;public boolean isRun;public MyThread(SurfaceHolder holder){this.holder=holder;isRun=true;}@Overridepublic void run() {int count=0;while(isRun){Canvas canvas=null;try {synchronized (holder){canvas=holder.lockCanvas();canvas.drawColor(Color.BLACK);Paint p=new Paint();p.setColor(Color.RED);p.setAntiAlias(true);p.setStyle(Paint.Style.FILL);canvas.drawRect(10,10,100,100,p);p.setTextSize(30);canvas.drawText("当前是第 "+(count++)+" 秒",10,150,p);Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}finally {holder.unlockCanvasAndPost(canvas);}}}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {thread=new MyThread(holder);thread.isRun=true;new Thread(thread).start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {thread.isRun=false;}
}


SurfaceView播放视频

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;import java.io.IOException;public class VideoActivity extends AppCompatActivity implements SurfaceHolder.Callback {private SurfaceView surfaceView;private SurfaceHolder holder;private MediaPlayer mp;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_video);surfaceView=findViewById(R.id.surfaceView);holder=surfaceView.getHolder();holder.addCallback(this);holder.setFixedSize(320,220);}public void playClick(View view){mp.start();}public void pauseClick(View view){mp.pause();}public void stopClick(View view){mp.stop();}@Overridepublic void surfaceCreated(SurfaceHolder holder) {mp=new MediaPlayer();mp.setAudioStreamType(AudioManager.STREAM_MUSIC);mp.setDisplay(holder);String path= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)+"/2.mp4";try {mp.setDataSource(path);//设置播放视频源mp.prepare();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if(mp!=null){if(mp.isPlaying()){mp.stop();mp.release();}}}@Overrideprotected void onDestroy() {super.onDestroy();if(mp!=null){if(mp.isPlaying()){mp.stop();mp.release();}}}
}

添加权限

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.INTERNET"/>

安卓学习日记——画布与绘制相关推荐

  1. 安卓学习日记:初识Android Studio · java环境配置和AS安装

    工欲善其事,必先利其器.要进行安卓开发,必须要有一款上手的开发利器.查阅了相关资料后,了解到,现在主流的安卓开发工具是: 1. Eclipse + Android SDK 2. Android Stu ...

  2. 安卓学习日记——Shortcut

    Shortcuts初体验 好了, 在我们开始撸码之前, 还是来看看这个新特性有多赞, 新系统中好多google家的APP都集成了这项功能, 所以, 我们先挑个APP来体验一下. 长按会发现有个快捷打开 ...

  3. 安卓学习日记(一):了解安卓架构(linux内核层、系统运行库层、应用框架层、应用层)

    首先为了理解安卓系统是怎么工作的,就先来看一下android的系统架构,其架构大至可以分为四层:linux内核层.系统运行库层.应用框架层和应用层,那就先说说这几层. 1.linux内核层: Andr ...

  4. 安卓学习日记——在线支付

    Pingxx 官网:https://www.pingxx.com/ 服务器端和客户端的配置参考官方的文档 客户端代码 package com.example.pingxx;import android ...

  5. 安卓学习日记——Vitamio框架

    Vitamio中文名称"维他蜜",是一款Android与IOS平台上的全能多媒体开发框架,全面支持硬件解码与GPU渲染.Vitamio能够流程播放720P甚至1080P高清MKV, ...

  6. 安卓学习日记——广告

    万普积分墙 去万普官网,注册账号,登录(www.waps.cn) 下载SKD,导包 添加权限 <uses-permission android:name="android.permis ...

  7. 安卓学习日记——媒体播放

    简介 Android的多媒体框架包括支持播放多种常见的媒体类型,使您可以轻松地把音频.视频和图像集成到你的应用.你可以播放音频或视频媒体文件,这些文件是存储在你的应用程序的资源文件中的.应用程序的资源 ...

  8. 安卓学习日记——APP共享内容

    分享简单的文本内容 public void sharedSimpleContentClick(View v){Intent intent=new Intent();intent.setAction(I ...

  9. 安卓学习日记——补间动画与帧动画

    Animation介绍 Android提供了几种动画类型:View Animation.Drawable Animation.Property Animation.View Animation相当简单 ...

最新文章

  1. C库函数-perror()
  2. opencv 高斯模糊
  3. JDBC+Servlet+JSP整合开发之22.JSP简介
  4. 交叉熵代价函数cross-entropy
  5. [SQL]实战之统计出当前各个title类型对应的员工当前薪水对应的平均工资
  6. 【声源定位】基于matlab广义互相关声源定位【含Matlab源码 548期】
  7. hls解密key获取失败_请求帮助。M3U8里的加密key无法下载。
  8. (转载)New poker 2总算放出新固件了!
  9. 高新技术背景下超大城市垃圾处理的成本控制研究
  10. php 设置允许跨域请求
  11. android自动秒杀脚本,京东自动秒杀脚本手机版-京东自动秒杀脚本安卓版下载v7.0.4 - 7230手游网...
  12. Learning-Based Approximation of Interconnect Delay and Slew in Signoff Timing Tools
  13. 最全面的文本生成评价指标大盘点
  14. html生成闪电特效
  15. c语言常见warning的消除方法及重要性
  16. Beyond Compare 4.2.10 zhuce
  17. 字典树/Trie/前缀树-LeetCode总结:720词典中最长的单词;127. 单词接龙;677. 键值映射;面试题 17.17. 多次搜索;648. 单词替换
  18. 关于程序化交易系统的详细定义
  19. 主控芯片,划定MP3素质和档次的核心和大脑
  20. 『Java安全』反序列化-CC7反序列化漏洞POP链分析_ysoserial CommonsCollections7 PoC分析

热门文章

  1. 一个Java开发h5牌九棋牌网站开发细节
  2. 烟沙浮生 | 曾几何时,还是游吟长安的醉客
  3. Laya.TextInput组件中禁用后改变输入框背景色和文字颜色
  4. Creating schema using Saiku Schema Designer
  5. Python 基础 - Day 1 Assignment - Three tier menu 三级菜单
  6. 【SQLSERVER 2000】由于数据移动,未能继续以 NOLOCK 方式扫描
  7. 计算机开始菜的mstsc命令,Win10一周年更新版系统CLSID(GUID)汇总
  8. Java【案例6-2】 学生管理系统
  9. zabbix应用之详细的拓扑图标签--链路流量
  10. 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)