Android繪制文本與圖片及動(dòng)效詳解
繪制文本
繪制類 借助 Canvas 類進(jìn)行繪制
通過重寫View.onDraw 方法來進(jìn)行旁白描繪
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)); //將自定義視圖的內(nèi)部類添加到布局管理器中 } private class MyView extends View { public MyView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { //重寫onDraw()方法 Paint paint = new Paint(); //定義一個(gè)默認(rèn)的畫筆 //線性漸變 Shader shader = new LinearGradient(0, 0, 100, 100, Color.RED, Color.GREEN, Shader.TileMode.MIRROR); paint.setShader(shader); //為畫筆設(shè)置漸變器 canvas.drawRect(10, 10, 280, 150, paint); //繪制矩形 super.onDraw(canvas); } } }
繪制圖片
創(chuàng)建位圖對(duì)象, JAVA 中bitmap 表示位圖對(duì)象
創(chuàng)建位圖對(duì)象 兩種方式:
BitMapFactory :
- 1. 通過圖片文件創(chuàng)建
- 2. 通過輸入流創(chuàng)建
BitMap類挖取一塊圖像創(chuàng)建,將源位圖縮放生成,使用顏色數(shù)組創(chuàng)建
BitMapFactory:
1.decodeFile,
2.decodeResource,
3.decodeStream
訪問SDK資源需要在Mainiefiest.xml 配置訪問權(quán)限
<uses-premission android:name="android.permission.READ_EXTERNAL_STOTAHE">
同時(shí)在Android 上配置訪問權(quán)限
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; /** * 手勢(shì)方式滑動(dòng)動(dòng)畫 */ 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)); //將自定義視圖的內(nèi)部類添加到布局管理器中 } } 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)); //將自定義視圖的內(nèi)部類添加到布局管理器中 } } /** * 繪制路徑 * */ 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); // 設(shè)置樣式為描邊 Path path = new Path(); // 最后一個(gè)參數(shù)環(huán)按照 順時(shí)針還是 path.addCircle(150,100,50,Path.Direction.CW); // canvas.drawPath(path,paint); canvas.drawTextOnPath("活著就是為了修改時(shí)間", path,0,0,paint); } }
逐幀動(dòng)畫
創(chuàng)建動(dòng)畫資源文件 在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 方法設(shè)置動(dòng)態(tài)圖逐幀播放
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對(duì)象 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; } } }); } }
補(bǔ)間動(dòng)畫
- 通過手勢(shì)滑動(dòng)查看相片的手機(jī)相冊(cè)
- 創(chuàng)建一個(gè)動(dòng)畫資源
參考手勢(shì)時(shí)候 設(shè)置動(dòng)畫資源文件 <?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>
- 定義并且初始化動(dòng)畫數(shù)組
- 指定切換的動(dòng)畫效果
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; //定義手勢(shì)檢測(cè)器 Animation[] animation = new Animation[4];//定義動(dòng)畫數(shù)組,為ViewFlipper指定切換動(dòng)畫 final int distance = 50; //定義手勢(shì)動(dòng)作兩點(diǎn)之間最小距離 //定義圖片數(shù)組 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); //創(chuàng)建手勢(shì)檢測(cè)器 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); //加載圖片 } //初始化動(dòng)畫數(shù)組 animation[0] = AnimationUtils.loadAnimation(this, R.anim.anim_alpha_in); //淡入動(dòng)畫 animation[1] = AnimationUtils.loadAnimation(this, R.anim.anim_alpha_out); //淡出動(dòng)畫 animation[2] = AnimationUtils.loadAnimation(this, R.anim.anim_scale_in); //放大進(jìn)入動(dòng)畫 animation[3] = AnimationUtils.loadAnimation(this, R.anim.anim_scale_out); //縮小退出動(dòng)畫 } @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) { /* 如果第一個(gè)觸點(diǎn)事件的X坐標(biāo)到第二個(gè)觸點(diǎn)事件的X坐標(biāo)的距離超過distance就是從右向左滑動(dòng) */ if (e1.getX() - e2.getX() > distance) { //為flipper設(shè)置切換的動(dòng)畫效果 flipper.setInAnimation(animation[0]); flipper.setOutAnimation(animation[1]); flipper.showPrevious(); return true; /* 如果第二個(gè)觸點(diǎn)事件的X坐標(biāo)到第一個(gè)觸點(diǎn)事件的X坐標(biāo)的距離超過distance就是從左向右滑動(dòng) */ } else if (e2.getX() - e1.getX() > distance) { //為flipper設(shè)置切換的動(dòng)畫 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); } }
到此這篇關(guān)于Android繪制文本與圖片及動(dòng)效詳解的文章就介紹到這了,更多相關(guān)Android繪制文本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android getActivity()為空的問題解決辦法
這篇文章主要介紹了Android getActivity()為空的問題解決辦法的相關(guān)資料,導(dǎo)致apk空指針崩潰問題,很嚴(yán)重的問題,為了解決這問題,上網(wǎng)搜索了很多資料,需要的朋友可以參考下2017-07-07Android關(guān)于Glide的使用(高斯模糊、加載監(jiān)聽、圓角圖片)
這篇文章主要為大家詳細(xì)介紹了Android關(guān)于Glide的使用,內(nèi)容豐富,高斯模糊、加載監(jiān)聽、圓角圖片希望大家可以掌握,感興趣的小伙伴們可以參考一下2016-11-11Android編程實(shí)現(xiàn)的短信編輯器功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)的短信編輯器功能,涉及Android權(quán)限控制、界面布局及短信功能相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Android Shape屬性創(chuàng)建環(huán)形進(jìn)度條
這篇文章主要介紹了Android Shape屬性創(chuàng)建環(huán)形進(jìn)度條的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11如何利用Android Studio將moudle變成jar示例詳解
這篇文章主要給大家介紹了關(guān)于如何利用Android Studio將moudle變成jar的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08appium運(yùn)行各種坑爹報(bào)錯(cuò)問題及解決方法【推薦】
這篇文章主要介紹了 appium運(yùn)行各種坑爹報(bào)錯(cuò)問題及解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06Android 之BottomsheetDialogFragment仿抖音評(píng)論底部彈出對(duì)話框效果(實(shí)例代碼)
這篇文章主要介紹了Android 中之BottomsheetDialogFragment仿抖音評(píng)論底部彈出對(duì)話框效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04Android 將本地資源圖片轉(zhuǎn)換成Drawable,進(jìn)行設(shè)置大小操作
這篇文章主要介紹了Android 將本地資源圖片轉(zhuǎn)換成Drawable,進(jìn)行設(shè)置大小操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08Android自定義照相機(jī)Camera出現(xiàn)黑屏的解決方法
這篇文章主要介紹了Android自定義照相機(jī)Camera出現(xiàn)黑屏的解決方法,分析了黑屏出現(xiàn)的原因及參考解決方法,需要的朋友可以參考下2016-08-08