日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android SurfaceView实现静态于动态画图效果

發(fā)布時(shí)間:2025/3/15 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android SurfaceView实现静态于动态画图效果 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文是基于Android的SurfaceView的動(dòng)態(tài)畫圖效果,實(shí)現(xiàn)靜態(tài)和動(dòng)態(tài)下的正弦波畫圖,可作為自己做圖的簡單參考,廢話不多說,先上圖,

靜態(tài)效果:

動(dòng)態(tài)效果:

?

比較簡單,代碼注釋的也比較詳細(xì),易懂,我就直接上代碼了吧:

1.main.xml

  • <?xml?version="1.0"?encoding="utf-8"?>??
  • <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??
  • ????android:layout_width="fill_parent"??
  • ????android:layout_height="fill_parent"??
  • ????android:orientation="vertical"?>??
  • <SurfaceView???
  • ????android:layout_width="fill_parent"??
  • ????android:layout_height="600px"??
  • ????android:id="@+id/surfaceview_draw"/>??
  • <RelativeLayout?android:layout_width="fill_parent"??
  • ????android:layout_height="wrap_content">??
  • <Button?android:layout_below="@id/surfaceview_draw"??
  • ????android:layout_marginLeft="7dip"??
  • ????android:id="@+id/simpledraw_btn"??
  • ????android:text="簡單繪圖"??
  • ????android:layout_width="wrap_content"??
  • ????android:layout_height="wrap_content"??
  • ????android:textSize="20dip"/>??
  • ??
  • <Button??
  • ????android:id="@+id/timerdraw_btn"??
  • ????android:layout_width="wrap_content"??
  • ????android:layout_height="wrap_content"??
  • ????android:layout_toRightOf="@id/simpledraw_btn"??
  • ????android:text="定時(shí)繪圖"???
  • ????android:textSize="20dip"/>??
  • <Button???
  • ????android:id="@+id/cleardraw_btn"??
  • ????android:layout_width="wrap_content"??
  • ????android:layout_height="wrap_content"??
  • ????android:layout_toRightOf="@id/timerdraw_btn"??
  • ????android:text="清除圖像"??
  • ????android:textSize="20dip"/>??
  • </RelativeLayout>??
  • </LinearLayout>??
  • 2.SurfaceViewDrawActivity.java

  • package?com.huangcheng.draw;??
  • ??
  • import?java.util.Timer;??
  • import?java.util.TimerTask;??
  • ??
  • import?android.app.Activity;??
  • import?android.graphics.Canvas;??
  • import?android.graphics.Color;??
  • import?android.graphics.Paint;??
  • import?android.graphics.Rect;??
  • import?android.os.Bundle;??
  • import?android.util.Log;??
  • import?android.view.SurfaceHolder;??
  • import?android.view.SurfaceView;??
  • import?android.view.View;??
  • import?android.view.View.OnClickListener;??
  • import?android.widget.Button;??
  • ??
  • public?class?SurfaceViewDrawActivity?extends?Activity?{??
  • ????/**?Called?when?the?activity?is?first?created.?*/??
  • ????private?SurfaceView?surface_draw;??
  • ????private?SurfaceHolder?surfaceholder;??
  • ??
  • ????private?Button?simpledraw_btn;??
  • ????private?Button?timerdraw_btn;??
  • ????private?Button?cleardraw_btn;??
  • ??
  • ????private?Timer?timer;??
  • ????private?TimerTask?timertask;??
  • ??
  • ????private?int[]?Y;//?保存圖像Y軸上的點(diǎn)???
  • ????private?int?centerY,?oldX,?oldY,?currentX;//?保存水平中心線位置,上一個(gè)(x,y)點(diǎn),當(dāng)先繪制到的x???
  • ??
  • ????private?volatile?int?signal=0;??
  • ????@Override??
  • ????public?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.main);??
  • ????????surface_draw?=?(SurfaceView)?findViewById(R.id.surfaceview_draw);??
  • ????????surfaceholder?=?surface_draw.getHolder();??
  • ??
  • ????????simpledraw_btn?=?(Button)?findViewById(R.id.simpledraw_btn);??
  • ????????timerdraw_btn?=?(Button)?findViewById(R.id.timerdraw_btn);??
  • ????????cleardraw_btn?=?(Button)?findViewById(R.id.cleardraw_btn);??
  • ????????cleardraw_btn.setEnabled(false);??
  • ??
  • ????????centerY?=?300;??
  • ????????Y?=?new?int[getWindowManager().getDefaultDisplay().getWidth()];??
  • ????????for?(int?i?=?1;?i?<?Y.length?+?1;?i++)?{??
  • ????????????Y[i?-?1]?=?centerY?+?(int)?(100?*?Math.sin(i?*?2?*?Math.PI?/?180));??
  • ????????????//?System.out.println("sin:"+100*Math.sin(i*2*Math.PI/180));???
  • ????????}??
  • ????????simpledraw_btn.setOnClickListener(new?OnClickListener()?{??
  • ??
  • ????????????@Override??
  • ????????????public?void?onClick(View?arg0)?{??
  • ????????????????//?TODO?Auto-generated?method?stub???
  • ????????????????simpledraw();//?靜態(tài)繪制正弦圖???
  • ????????????????signal=1;??
  • ????????????????simpledraw_btn.setEnabled(false);??
  • ????????????????timerdraw_btn.setEnabled(false);??
  • ????????????????cleardraw_btn.setEnabled(true);??
  • ????????????}??
  • ????????});??
  • ????????timerdraw_btn.setOnClickListener(new?OnClickListener()?{??
  • ??
  • ????????????@Override??
  • ????????????public?void?onClick(View?arg0)?{??
  • ????????????????//?TODO?Auto-generated?method?stub???
  • ????????????????oldX=0;??
  • ????????????????oldY=centerY;??
  • ????????????????currentX=0;??
  • ????????????????timer=new?Timer();??
  • ????????????????timertask=new?TimerTask()?{??
  • ??????????????????????
  • ????????????????????@Override??
  • ????????????????????public?void?run()?{??
  • ????????????????????????//?TODO?Auto-generated?method?stub???
  • ????????????????????????currentX++;??
  • ????????????????????????complexdraw(currentX);??
  • ????????????????????????if(currentX==Y.length-1){??
  • ????????????????????????????ClearDraw();??
  • ????????????????????????????currentX?=?0;??
  • ????????????????????????????oldX=0;??
  • ????????????????????????????oldY=centerY;??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????};??
  • ????????????????timer.schedule(timertask,?0,?5);//?動(dòng)態(tài)繪制正弦圖???
  • ????????????????signal=2;??
  • ????????????????simpledraw_btn.setEnabled(false);??
  • ????????????????timerdraw_btn.setEnabled(false);??
  • ????????????????cleardraw_btn.setEnabled(true);??
  • ????????????}??
  • ????????});??
  • ????????cleardraw_btn.setOnClickListener(new?OnClickListener()?{??
  • ??????????????
  • ????????????@Override??
  • ????????????public?void?onClick(View?arg0)?{??
  • ????????????????//?TODO?Auto-generated?method?stub???
  • ????????????????if(signal==1){??
  • ????????????????????ClearDraw();??
  • ????????????????????simpledraw_btn.setEnabled(true);??
  • ????????????????????timerdraw_btn.setEnabled(true);??
  • ????????????????}??
  • ????????????????if(signal==2){??
  • ????????????????????timertask.cancel();??
  • ????????????????????timer.cancel();??
  • ????????????????????ClearDraw();??
  • ????????????????????simpledraw_btn.setEnabled(true);??
  • ????????????????????timerdraw_btn.setEnabled(true);??
  • ????????????????}??
  • ????????????}??
  • ????????});??
  • ????}??
  • ????//?簡單畫圖???
  • ????void?simpledraw()?{??
  • ????????oldX?=?0;??
  • ????????oldY?=?centerY;??
  • ????????Canvas?canvas?=?surfaceholder??
  • ????????????????.lockCanvas(new?Rect(oldX,?0,?oldX?+?Y.length,??
  • ????????????????????????getWindowManager().getDefaultDisplay().getHeight()));//?關(guān)鍵:獲取畫布???
  • ????????Log.i("Canvas:X:",??
  • ????????????????String.valueOf(oldX)?+?","?+?String.valueOf(oldX?+?Y.length));??
  • ??
  • ????????Paint?mPaint?=?new?Paint();??
  • ????????mPaint.setColor(Color.GREEN);//?畫筆為綠色???
  • ????????mPaint.setStrokeWidth(2);//?設(shè)置畫筆粗細(xì)???
  • ??
  • ????????int?y;??
  • ??
  • ????????for?(int?i?=?oldX?+?1;?i?<?Y.length;?i++)?{//?繪畫正弦波???
  • ????????????y?=?Y[i?-?1];??
  • ????????????canvas.drawLine(oldX,?oldY,?i,?y,?mPaint);??
  • ????????????//?System.out.println("oldX:"+oldX+"?oldY:"+oldY+",x:"+i+"?y:"+y);???
  • ????????????oldX?=?i;??
  • ????????????oldY?=?y;??
  • ????????}??
  • ????????surfaceholder.unlockCanvasAndPost(canvas);??
  • ????}??
  • ??
  • ????//?消除畫得圖???
  • ????void?ClearDraw()?{??
  • ????????Canvas?canvas?=?surfaceholder.lockCanvas(null);??
  • ????????canvas.drawColor(Color.BLACK);//?清除畫布???
  • ????????surfaceholder.unlockCanvasAndPost(canvas);??
  • ????}??
  • ????//動(dòng)態(tài)畫圖???
  • ????void?complexdraw(int?current){??
  • ????????Canvas?canvas?=?surfaceholder??
  • ????????????????.lockCanvas(new?Rect(oldX,?0,?current,??
  • ????????????????????????getWindowManager().getDefaultDisplay().getHeight()));//?關(guān)鍵:獲取畫布???
  • ????????Log.i("Canvas:X:",??
  • ????????????????String.valueOf(oldX)?+?","?+?String.valueOf(oldX?+?Y.length));??
  • ??
  • ????????Paint?mPaint?=?new?Paint();??
  • ????????mPaint.setColor(Color.GREEN);//?畫筆為綠色???
  • ????????mPaint.setStrokeWidth(2);//?設(shè)置畫筆粗細(xì)???
  • ??????????
  • ????????int?y=Y[current-1];??
  • ????????canvas.drawLine(oldX,?oldY,?current,?y,?mPaint);??
  • ????????//?System.out.println("oldX:"+oldX+"?oldY:"+oldY+",x:"+i+"?y:"+y);???
  • ????????oldX?=?current;??
  • ????????oldY?=?y;??
  • ????????surfaceholder.unlockCanvasAndPost(canvas);??
  • ????}??
  • } ?
  • 轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/4750030.html

    總結(jié)

    以上是生活随笔為你收集整理的Android SurfaceView实现静态于动态画图效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。