Android自定義SurfaceView實(shí)現(xiàn)畫(huà)板功能
接觸了這么久的View,總不能一直停留在View里,現(xiàn)在開(kāi)始呢,就要學(xué)習(xí)一個(gè)新的知識(shí)點(diǎn):SurfaceView,實(shí)際上SurfaceView與View的原理都差不多,只是效率和渲染方式上,SurfaceView要優(yōu)于View,這也是我們寫(xiě)這個(gè)的原因。今天就看看這個(gè)SurfaceView,好了,下面就是今天要說(shuō)的效果。

界面很簡(jiǎn)單,就是一個(gè)按鈕以及一個(gè)畫(huà)板,先看看界面的代碼吧
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.xinxindemo.MainActivity" > <com.example.xinxindemo.view.SecondSurfaceView android:id="@+id/surfaceview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="20" /> <LinearLayout android:layout_width="match_parent" android:layout_height="55dip" android:orientation="horizontal" android:padding="5dip" > <Button android:onClick="onClick" android:layout_width="wrap_content" android:layout_height="match_parent" android:text="clean" /> </LinearLayout> </LinearLayout>
對(duì)吧,界面不是很復(fù)雜,下面再看看這個(gè)SecondSurfaceView是怎么實(shí)現(xiàn)的;
/**
* 2016年7月26日17:20:13
* @author 小瓶蓋 blog
*
*/
public class SecondSurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable{
/**
* 是否處于繪制狀態(tài)
*/
private boolean mIsDrawing;
/**
* 幫助類
*/
private SurfaceHolder mHolder;
/**
* 畫(huà)布
*/
private Canvas mCanvas;
/**
* 路徑
*/
private Path mPath;
/**
* 畫(huà)筆
*/
private Paint mPaint;
public SecondSurfaceView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
public SecondSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public SecondSurfaceView(Context context) {
super(context);
initView();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x=(int) event.getX();
int y=(int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPath.moveTo(x, y);
break;
case MotionEvent.ACTION_MOVE:
mPath.lineTo(x, y);
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
private void initView() {
mHolder=getHolder();
mHolder.addCallback(this);
setFocusable(true);
setFocusableInTouchMode(true);
this.setKeepScreenOn(true);
mPath=new Path();
mPaint=new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth(15);
}
@Override
public void run() {
long start =System.currentTimeMillis();
while(mIsDrawing){
draw();
}
long end =System.currentTimeMillis();
if (end-start<100) {
try {
Thread.sleep(100-(end-start));
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
mIsDrawing=true;
new Thread(this).start();
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
mIsDrawing=false;
}
private void draw(){
try {
mCanvas=mHolder.lockCanvas();
mCanvas.drawColor(Color.WHITE);
mCanvas.drawPath(mPath, mPaint);
} catch (Exception e) {
e.printStackTrace();
}finally{
if (mCanvas!=null) {
mHolder.unlockCanvasAndPost(mCanvas);
}
}
}
/**
* 清除內(nèi)容
*/
public void clean(){
initView();
}
}
然后就是MainActivity.java
/**
* 2016年7月26日17:20:13
* @author 小瓶蓋 blog *
*/
public class MainActivity extends Activity{
SecondSurfaceView surfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView=(SecondSurfaceView)findViewById(R.id.surfaceview);
}
public void onClick(View v){
surfaceView.clean();
}
}
源碼下載:http://xiazai.jb51.net/201607/yuanma/SurfaceView(jb51.net).rar
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android實(shí)現(xiàn)簡(jiǎn)單的畫(huà)畫(huà)板實(shí)例代碼
- Android實(shí)現(xiàn)畫(huà)板、寫(xiě)字板功能(附源碼下載)
- Android采用雙緩沖技術(shù)實(shí)現(xiàn)畫(huà)板
- Android畫(huà)板開(kāi)發(fā)之添加背景和保存畫(huà)板內(nèi)容為圖片
- Android畫(huà)板開(kāi)發(fā)之橡皮擦功能
- Android實(shí)現(xiàn)畫(huà)畫(huà)板案例
- Android編程實(shí)現(xiàn)畫(huà)板功能的方法總結(jié)【附源碼下載】
- Android畫(huà)板開(kāi)發(fā)之撤銷反撤銷功能
- Android多媒體之畫(huà)畫(huà)板開(kāi)發(fā)案例分享
- Android自定義View實(shí)現(xiàn)簡(jiǎn)易畫(huà)板功能
相關(guān)文章
Android 中ImageView的ScaleType使用方法
這篇文章主要介紹了Android 中ImageView的ScaleType使用方法的相關(guān)資料,希望通過(guò)本能幫助到大家,需要的朋友可以參考下2017-09-09
Android自定義View實(shí)現(xiàn)QQ運(yùn)動(dòng)積分轉(zhuǎn)盤(pán)抽獎(jiǎng)功能
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)QQ運(yùn)動(dòng)積分轉(zhuǎn)盤(pán)抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
android 開(kāi)發(fā)教程之日歷項(xiàng)目實(shí)踐(三)
決定開(kāi)始學(xué)習(xí) Android 平臺(tái)下的軟件開(kāi)發(fā),以日歷作為實(shí)踐項(xiàng)目,進(jìn)行一周后,基本完成,有需要的朋友可以參考下2013-01-01
android基礎(chǔ)總結(jié)篇之九:Intent應(yīng)用詳解
這篇文章主要介紹了android基礎(chǔ)總結(jié)篇之九:Intent應(yīng)用詳解,有需要的可以了解一下。2016-11-11
Android下2d物理引擎Box2d用法簡(jiǎn)單實(shí)例
這篇文章主要介紹了Android下2d物理引擎Box2d用法,實(shí)例分析了在Android平臺(tái)上使用Box2d的基本技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
當(dāng)Flutter遇到節(jié)流與防抖的思路和流程優(yōu)化
這篇文章主要給大家介紹了關(guān)于當(dāng)Flutter遇到節(jié)流與防抖的思路和流程優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
一個(gè)Activity中多個(gè)Fragment實(shí)現(xiàn)沉浸式狀態(tài)欄的解決方法
這篇文章主要介紹了一個(gè)Activity中多個(gè)Fragment實(shí)現(xiàn)沉浸式狀態(tài)欄解決方法,對(duì)于解決這個(gè)問(wèn)題要分為兩部分,具體內(nèi)容詳情,大家參考下本文吧2017-01-01

