Android绘制文本与图片及动效详解
绘制文本
绘制类 借助 Canvas 类进行绘制
通过重写View.onDraw 方法来进行旁白描绘
package com.mingrisoft; import android.app.Fragment; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.Shader; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.FrameLayout; import android.widget.RelativeLayout; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FrameLayout fragment = (FrameLayout) findViewById(R.id.frameLayout); //获取帧布局管理器 fragment.addView(new MyView(this)); //将自定义视图的内部类添加到布局管理器中 } private class MyView extends View { public MyView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { //重写onDraw()方法 Paint paint = new Paint(); //定义一个默认的画笔 //线性渐变 Shader shader = new LinearGradient(0, 0, 100, 100, Color.RED, Color.GREEN, Shader.TileMode.MIRROR); paint.setShader(shader); //为画笔设置渐变器 canvas.drawRect(10, 10, 280, 150, paint); //绘制矩形 super.onDraw(canvas); } } }
绘制图片
创建位图对象, JAVA 中bitmap 表示位图对象
创建位图对象 两种方式:
BitMapFactory :
- 1. 通过图片文件创建
- 2. 通过输入流创建
BitMap类挖取一块图像创建,将源位图缩放生成,使用颜色数组创建
BitMapFactory:
1.decodeFile,
2.decodeResource,
3.decodeStream
访问SDK资源需要在Mainiefiest.xml 配置访问权限
<uses-premission android:name="android.permission.READ_EXTERNAL_STOTAHE">
同时在Android 上配置访问权限
package com.example.myapplication; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.FrameLayout; import androidx.appcompat.app.AppCompatActivity; /** * 手势方式滑动动画 */ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FrameLayout frameLayout= (FrameLayout) findViewById(R.id.frameLayout); //获取帧布局管理器 frameLayout.addView(new MyView(this)); //将自定义视图的内部类添加到布局管理器中 } } class MyView extends View { public MyView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 获取SDK上 图片绘制 String path = Environment.getExternalStorageDirectory() + "/snail.png"; Bitmap bitmap = BitmapFactory.decodeFile(path); //通过 canvas 类 绘制图片 Paint paint = new Paint(); //定义 canvas.drawBitmap(bitmap,150,150, paint); // 从图像中挖取一小片 bitMap 类 的 createBitMap(截取一小块), compress(压缩) // 从原始图像挖取小部分 Bitmap bitmap1 = Bitmap.createBitmap(bitmap,23,89,150,168); canvas.drawBitmap(bitmap1,270,50, paint); } }
绘制路径
- 通过绘制路径
- 通过绘制路径的文字
package com.example.myapplication; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.os.Bundle; import android.view.View; import android.widget.FrameLayout; import androidx.appcompat.app.AppCompatActivity; /** * */ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FrameLayout frameLayout= (FrameLayout) findViewById(R.id.frameLayout); //获取帧布局管理器 frameLayout.addView(new MyView(this)); //将自定义视图的内部类添加到布局管理器中 } } /** * 绘制路径 * */ class MyView extends View { public MyView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setAntiAlias(true) ; // 定义抗锯齿 paint.setColor(0xFF0000FF); paint.setStyle(Paint.Style.STROKE); // 设置样式为描边 Path path = new Path(); // 最后一个参数环按照 顺时针还是 path.addCircle(150,100,50,Path.Direction.CW); // canvas.drawPath(path,paint); canvas.drawTextOnPath("活着就是为了修改时间", path,0,0,paint); } }
逐帧动画
创建动画资源文件 在drawable 目录下面
使用 animation-list <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/img001" android:duration="60"/> <item android:drawable="@drawable/img002" android:duration="60"/> <item android:drawable="@drawable/img003" android:duration="60"/> <item android:drawable="@drawable/img004" android:duration="60"/> <item android:drawable="@drawable/img005" android:duration="60"/> <item android:drawable="@drawable/img006" android:duration="60"/> </animation-list>
MainActivity 获取AnminationDrawable 方法设置动态图逐帧播放
package com.example.myapplication; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; import androidx.appcompat.app.AppCompatActivity; /** * */ public class MainActivity extends AppCompatActivity { private boolean flag = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LinearLayout linearLayout= (LinearLayout) findViewById(R.id.linearLayout); //获取布局管理器 //获取AnimationDrawable对象 final AnimationDrawable anim = (AnimationDrawable) linearLayout.getBackground(); linearLayout.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { if(flag){ anim.start(); flag = false; }else{ anim.stop(); flag = true; } } }); } }
补间动画
- 通过手势滑动查看相片的手机相册
- 创建一个动画资源
参考手势时候 设置动画资源文件 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="4000"/> </set> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:fromAlpha="1" android:toAlpha="0" android:duration="2000"/> </set> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="0.0" android:fromYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.0" android:toYScale="1.0" android:duration="2000"></scale> </set> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="50%" android:pivotY="50%" android:toXScale="0.0" android:toYScale="0.0" android:duration="2000"></scale> </set>
- 定义并且初始化动画数组
- 指定切换的动画效果
package com.example.myapplication; import android.os.Bundle; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.ViewFlipper; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener { ViewFlipper flipper; //定义ViewFlipper GestureDetector detector; //定义手势检测器 Animation[] animation = new Animation[4];//定义动画数组,为ViewFlipper指定切换动画 final int distance = 50; //定义手势动作两点之间最小距离 //定义图片数组 private int[] images = new int[]{R.drawable.img01, R.drawable.img02, R.drawable.img03, R.drawable.img04, R.drawable.img05, R.drawable.img06, R.drawable.img07, R.drawable.img08, }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); detector = new GestureDetector(this, this); //创建手势检测器 flipper = (ViewFlipper) findViewById(R.id.flipper); //获取ViewFlipper for (int i = 0; i < images.length; i++) { ImageView imageView = new ImageView(this); imageView.setImageResource(images[i]); flipper.addView(imageView); //加载图片 } //初始化动画数组 animation[0] = AnimationUtils.loadAnimation(this, R.anim.anim_alpha_in); //淡入动画 animation[1] = AnimationUtils.loadAnimation(this, R.anim.anim_alpha_out); //淡出动画 animation[2] = AnimationUtils.loadAnimation(this, R.anim.anim_scale_in); //放大进入动画 animation[3] = AnimationUtils.loadAnimation(this, R.anim.anim_scale_out); //缩小退出动画 } @Override public boolean onDown(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { /* 如果第一个触点事件的X坐标到第二个触点事件的X坐标的距离超过distance就是从右向左滑动 */ if (e1.getX() - e2.getX() > distance) { //为flipper设置切换的动画效果 flipper.setInAnimation(animation[0]); flipper.setOutAnimation(animation[1]); flipper.showPrevious(); return true; /* 如果第二个触点事件的X坐标到第一个触点事件的X坐标的距离超过distance就是从左向右滑动 */ } else if (e2.getX() - e1.getX() > distance) { //为flipper设置切换的动画 flipper.setInAnimation(animation[2]); flipper.setOutAnimation(animation[3]); flipper.showNext(); return true; } return false; } @Override public boolean onTouchEvent(MotionEvent event) { //将该Activity上的触碰事件交给GestureDetector处理 return detector.onTouchEvent(event); } }
到此这篇关于Android绘制文本与图片及动效详解的文章就介绍到这了,更多相关Android绘制文本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Android getActivity()为空的问题解决办法
这篇文章主要介绍了Android getActivity()为空的问题解决办法的相关资料,导致apk空指针崩溃问题,很严重的问题,为了解决这问题,上网搜索了很多资料,需要的朋友可以参考下2017-07-07Android关于Glide的使用(高斯模糊、加载监听、圆角图片)
这篇文章主要为大家详细介绍了Android关于Glide的使用,内容丰富,高斯模糊、加载监听、圆角图片希望大家可以掌握,感兴趣的小伙伴们可以参考一下2016-11-11如何利用Android Studio将moudle变成jar示例详解
这篇文章主要给大家介绍了关于如何利用Android Studio将moudle变成jar的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来跟着小编一起学习学习吧。2017-08-08Android 之BottomsheetDialogFragment仿抖音评论底部弹出对话框效果(实例代码)
这篇文章主要介绍了Android 中之BottomsheetDialogFragment仿抖音评论底部弹出对话框效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-04-04Android 将本地资源图片转换成Drawable,进行设置大小操作
这篇文章主要介绍了Android 将本地资源图片转换成Drawable,进行设置大小操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-08-08
最新评论