編輯:關於Android編程
工作需要,對這方面做了一些了解
一般的手寫對android canvas有點理解的應該都知道,只需要單純的使用drawPath就可以在view上畫畫。
而手寫筆的關鍵則是要讓path的strokeWidth發生變化
這個令人頭大了, 畢竟setPaint只能夠設置一個paint,一旦改變paint的參數,整個path都會發生改變。
所以,我們只能夠另辟蹊徑。
我們可以先開一個arraylist(Point),用來記錄我們在surfaceview(推薦在畫畫功能上使用surfaceview代替view,畢竟可以減輕ui線程的壓力)上劃過的坐標
Point tmpPoint = new Point(); tmpPoint.set((int) event.getX(), (int) event.getY()); pointStack.add(tmpPoint);大家想想手寫筆變化的因素是什麼,是速度!
所以,我們必須將我們劃過屏幕的速度記錄下來,並且!這個速度是要與我們的坐標點arraylist一一對應的,這樣子我們才可以在之後畫出我們想要的字。
android 為我們提供了 VelocityTracker 用來記錄速度
我們只需要在滑動的時候調用VelocityTracker對象就可以記錄下我們的速度
case MotionEvent.ACTION_DOWN:
if (mVelocityTracker == null) {
// Retrieve a new VelocityTracker object to watch the velocity
// of a motion.
mVelocityTracker = VelocityTracker.obtain();
} else {
// Reset the velocity tracker back to its initial state.
mVelocityTracker.clear();
}
// Add a user's movement to the tracker.
mVelocityTracker.addMovement(event);
path.moveTo(event.getX(), event.getY());
draw();
break;
case MotionEvent.ACTION_MOVE:
mVelocityTracker.addMovement(event);
mVelocityTracker.computeCurrentVelocity(1000);
double speed = getSpeed(
VelocityTrackerCompat.getYVelocity(mVelocityTracker,
event.getActionIndex()),
VelocityTrackerCompat.getXVelocity(mVelocityTracker,
event.getActionIndex()));
Point tmpPoint = new Point();
tmpPoint.set((int) event.getX(), (int) event.getY());
pointStack.add(tmpPoint);
strokeStack.add((float) (speed / 200));
draw();
break;
大家一定好奇,draw()方法是什麼東西呢
draw方法就用刷新surfaceview的方法
注意,我們在這裡定義了refreshArea可以讓我們只更新手指附近的區域,可以讓我們的ui刷新快很多!
我們使用path的qualTo方法,通過手指劃過的三點(首末兩點+中間的控制點)畫出多條貝塞爾曲線,而沒有一條path的strokeWidth則是由對應的速度決定的
public void draw() {
refreshArea = new Rect(drawing_point_end.x - Scale, drawing_point_end.y
- Scale, drawing_point_end.x + Scale, drawing_point_end.y
+ Scale);
Canvas canvas = getHolder().lockCanvas(refreshArea);
canvas.drawColor(Color.WHITE);
for (int i = 2; i < pointStack.size(); i++) {
Path path = new Path();
drawing_point_start = pointStack.get(i - 2);
drawing_point_middle = pointStack.get(i - 1);
path.moveTo(drawing_point_start.x, drawing_point_start.y);
if (strokeStack.get(i) > 25) {
p.setStrokeWidth(25);
} else {
p.setStrokeWidth(strokeStack.get(i));
}
drawing_point_end = pointStack.get(i);
path.quadTo(drawing_point_middle.x, drawing_point_middle.y,
drawing_point_end.x, drawing_point_end.y);
canvas.drawPath(path, p);
}
getHolder().unlockCanvasAndPost(canvas);
}
這樣畫出來就像手寫筆一樣啦
這個功能我只是想出了原型,後續工作交給別的同事了
大家也在這基礎上好好發揮吧
Android 實現智能機器人聊天
背景:其實,關於實現機器人聊天,是偶然的情況下的,公司需要做一個ios版的機器人,用於自動購買東西,然後ios就研發了一個,我覺得這種機器人挺好玩的,想明白到底怎麼實現,
Android游戲開發:實現手勢操作切換圖片的實例
對於Android 的手勢不光在軟件中會經常用到,比如浏覽器中的翻頁,滾動頁面等等;當然其實在我
Android 自定義解析之 HorizontalScrollView 打造再多圖片(控件)也不怕 OOM 的橫向滑動效果
看下最後的效果圖:為了增加一定的趣味,做了一個類似上面的相冊效果,支持拖動時自動變化,和點擊變化~~是不是很贊~1、首先看布局文件: [html]view pl
android高仿微信拍照、多選、預覽、刪除(去除相片)相冊功能
先聲明授人與魚不如授人與漁,只能提供一個思路,當然需要源碼的同學可以私下有償問我要源碼:QQ:508181017 工作了將近三年時間了,一直沒正兒八