網站首頁 編程語言 正文
繪制文本
繪制類 借助 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);
}
}
原文鏈接:https://blog.csdn.net/qq_27217017/article/details/107140457
相關推薦
- 2022-10-28 react如何向數組中追加值_React
- 2022-11-14 elasticsearch 性能優化
- 2023-04-26 Python?Flask的request對象使用詳解_python
- 2022-03-19 Nginx純配置實現日志實時上報的思路與方法_nginx
- 2022-11-08 uni-app 使用escook/request-miniprogram插件發請求
- 2024-01-27 什么是消息隊列
- 2021-12-11 C++嵌入式內存管理詳情_C 語言
- 2022-06-16 C#實現優先隊列和堆排序_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支