1. 程式人生 > 其它 >自定義view,用來測試螢幕

自定義view,用來測試螢幕

public class BezierGestureTrackView extends View {

private Bitmap mBufferBitmap;
private Canvas mBufferCanvas;

public BezierGestureTrackView(Context context) {
super(context);
}
PointF pointF;

Paint paint;
Paint paint2;

Path p,path ;

@ColorInt public static final int YELLOW = 0xFFFFFF00;
@ColorInt
public static final int CYAN = 0xFF00FFFF;
public static final int c1 = 0xEF8A97;
public static final int c2 = 0xFBD2A8;

public BezierGestureTrackView(Context context, AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
paint.setStyle(Paint.Style.STROKE);//設定畫筆的填充模式
paint.setStrokeJoin(Paint.Join.ROUND);//設定畫筆圖形接觸時筆跡的形狀
paint.setStrokeCap(Paint.Cap.ROUND);//設定畫筆離開畫板時筆跡的形狀
paint.setStrokeWidth(8);//設定畫筆粗細 6
paint.setAntiAlias(true);//設定抗鋸齒
paint.setColor(Color.WHITE);
initPaint();
// BitmapFactory.decodeResource(getResources(), R.drawable.hbbg);
}


//新建兩個SparseArray<Path>用來儲存我們畫出的Path物件,具體為什麼之後會解釋
//mActivePointers用來儲存當前正在畫的Path
SparseArray<Path> mActivePointers = new SparseArray<>();
//truePointers用來儲存所有的Path,在onDraw()方法裡面我們也是繪製這裡的所有Path
SparseArray<Path> truePointers = new SparseArray<>();

//儲存單個點
private int i=0;
private float[] a= new float[1000];

//重寫onTouchEvent()方法
@Override
public boolean onTouchEvent(MotionEvent event) {

//獲取當前DOWN或者UP的是手指的index
int curPointerIndex = event.getActionIndex();
//通過index獲得當前手指的id
int curPointerId = event.getPointerId(curPointerIndex);
//獲取當前正在發生的事件
int actionMasked = event.getActionMasked();

switch (actionMasked) {
//不管是第一個還是第N個手指落下,都執行以下方法:
case MotionEvent.ACTION_DOWN:


case MotionEvent.ACTION_POINTER_DOWN:
//新建一個PointF物件用來儲存點的座標
pointF = new PointF();
pointF.x = event.getX(curPointerIndex);
pointF.y = event.getY(curPointerIndex);
//每當有手指下落時,都新建一個Path,並移動到手指落下的點
Path p = new Path();
p.moveTo(pointF.x, pointF.y);
//將新建的path新增到mActivePointers中
mActivePointers.append(curPointerId, p);


//儲存單個點位置

if (i<998){
a[i++]=event.getX(curPointerIndex);
a[i++]=event.getY(curPointerIndex);
}


break;

case MotionEvent.ACTION_MOVE:
//當有手指移動時,遍歷mActivePointers,注意這裡遍歷的條件並不是mActivePointers.size(),而是event.getPointerCount()
//也就是隻監控當前所有正在滑動的手指數,另外在MotionEvent.ACTION_UP事件中,抬起的手指已經從mActivePointers中刪除了
for (int size = event.getPointerCount(), i = 0; i < size; i++) {
//獲取mActivePointers中的每一個Path
path = mActivePointers.get(event.getPointerId(i));
if (path != null) {
//更新每一個Path將得到的點連線
path.lineTo(event.getX(i), event.getY(i));

}
}

break;
case MotionEvent.ACTION_UP:


case MotionEvent.ACTION_POINTER_UP:
//當手指抬起時,代表已經繪製完畢,取得抬起的手指繪製圖線例項,傳入truePointers讓Drow()繪製
path = mActivePointers.get(curPointerId);
truePointers.append(truePointers.size(), path);
//從mActivePointers中將抬起的手指刪除
mActivePointers.remove(curPointerId);
break;

}
//重繪
invalidate();
return true;
}

private void initBuffer(){
mBufferBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
mBufferCanvas = new Canvas(mBufferBitmap);
}




@Override
protected void onDraw(Canvas canvas) {
//canvas.drawColor(Color.BLACK);


// Bitmap srcBitmap= BitmapFactory.decodeResource(getResources(), R.drawable.hbbg);
// canvas.drawBitmap(srcBitmap,0f,0f,null);





//遍歷mActivePointers,因為只有當手指抬起時Path才被加入truePointers,此時truePointers裡面還沒有儲存當前正在繪製的圖線
//如果沒有遍歷mActivePointers,則圖線不會即時顯示,只有在抬起手指的瞬間,圖線才會一起顯示
for (int size = mActivePointers.size(), i = 0; i < size; i++) {
Path path = mActivePointers.valueAt(i);
canvas.drawPath(path, paint);
}
//遍歷truePointers,這裡儲存的是當前正在畫的圖線
for (int size = truePointers.size(), i = 0; i < size; i++) {
path = truePointers.valueAt(i);
//繪製truePointers裡的所有Path
canvas.drawPath(path, paint);
}

if (pointF!=null){
//canvas.drawPoint(pointF.x, pointF.y,paint2);
canvas.drawPoints(a, paint2);


for (int j = 0; j < a.length; j++) {
Log.e("TAG","a:"+a[i]+"a的長度:"+a.length);
}
}

}
// public void clean(){
//// Canvas canvas = sh.lockCanvas();
////
////
//// if(canvas!=null){
//// Paint paint = new Paint();
//// paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
//// canvas.drawPaint(paint);
//////canvas.drawColor(Color.BLUE);
//// }
// Log.e("BezierGestureTrackView","CLEAN");
// }

public void clear() {


if (mBufferBitmap != null) {
if (mActivePointers!=null){
mActivePointers.clear();
}
if (truePointers != null) {
truePointers.clear();
}

mBufferBitmap.eraseColor(Color.TRANSPARENT);
invalidate();

}

}


private void initPaint() {
paint2 = new Paint();
//LinearGradient lg=new LinearGradient(0,0,100,100,Color.RED,Color.BLUE, Shader.TileMode.MIRROR); //引數一為漸變起初點座標x位
LinearGradient lg=new LinearGradient(0,0,100,100,CYAN,YELLOW, Shader.TileMode.MIRROR); //引數一為漸變起初點座標x位
paint2.setStyle(Paint.Style.STROKE);//設定畫筆的填充模式
paint2.setStrokeJoin(Paint.Join.ROUND);//設定畫筆圖形接觸時筆跡的形狀
paint2.setStrokeCap(Paint.Cap.ROUND);//設定畫筆離開畫板時筆跡的形狀
paint2.setStrokeWidth(45);//設定畫筆粗細 50
paint2.setAntiAlias(true);//設定抗鋸齒
paint2.setColor(Color.WHITE);//設定抗鋸齒
paint2.setShader(lg);
}
}