這是我網上找的一個類似的,我自己改動了一下,就是他會把座位當前的狀態存到一個list里面,list里面存放的是Point型的數,我給他改成第一個資料是i*m+j,表示第i排第j列,然后第二個資料1表示被選擇,這個時候用綠色的圖片,2表示確認已被選,用紅色圖片。。
這個好像是實時更新的,然后我自己創建了個矩形回應區,代替按鈕來做確認作業,本來是在外面加了個按鈕組件然后呼叫函式unsure(),結果不行才改的,現在感覺應該還是我unsure()和回應的方式的問題。。。下面是自定義View的class中和我錯誤相關的內容,其實引數定義和一些基本函式被我刪掉了
package
public class MoveSeatView extends View {
private void init() {
//座位水平間距
spacing = (int) dip2px(5);
//座位垂直間距
verSpacing = (int) dip2px(10);
//螢屏的最小寬度
defaultScreenWidth = (int) dip2px(80);
//可選座位圖片
seatBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.seat_default);
xScalel = defaultImgW / seatBitmap.getWidth();
yScalel = defaultImgH / seatBitmap.getHeight();
checkedSeatBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.seat_green);
unsureSeatBitmap =BitmapFactory.decodeResource(getResources(), R.drawable.seat_goal);
seatBitmapWidth = (int) (column * seatBitmap.getWidth() * xScalel + (column - 1) * spacing);
seatBitmapHeight = (int) (row * seatBitmap.getHeight() * yScalel + (row - 1) * verSpacing);
paint.setColor(Color.RED);
//行號寬度
numberWidth = (int) dip2px(20);
screenHeight = dip2px(20);
list = new ArrayList<>();
matrix.postTranslate(numberWidth + spacing, screenHeight + 1 + verSpacing);
}
@Override
protected void onDraw(Canvas canvas) {
if (row <= 0 || column <= 0) {
return;
}
/* if(mTouch)
{
unsure();
}*/
paint.setColor(Color.RED);
canvas.drawRect(80,1000,280,1100,paint);
drawSeat(canvas);
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
gestureDetector.onTouchEvent(event);
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
if(x>=80&&x<=280&&y>=1000&&y<=1100)
{
Toast.makeText(getContext(), "Hello", Toast.LENGTH_SHORT).show();
unsure();
}
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
private void drawSeat(Canvas canvas) {
zoom = getMatrixScaleX();
float translateX = getTranslateX();
float translateY = getTranslateY();
float scaleX = zoom;
float scaleY = zoom;
for (int i = 0; i < row; i++) {
float top = i * seatBitmap.getHeight() * yScalel * scaleY + i * verSpacing * scaleY + translateY;
float bottom = top + seatBitmap.getHeight() * yScalel * scaleY;
for (int j = 0; j < column; j++) {
float left = j * seatBitmap.getWidth() * xScalel * scaleX + j * spacing * xScalel * scaleX + translateX;
float right = left + seatBitmap.getWidth() * xScalel * scaleX;
tempMatrix.setTranslate(left, top);
tempMatrix.postScale(xScalel, yScalel, left, top);
tempMatrix.postScale(scaleX, scaleY, left, top);
if (isHave(i*column+j, 1)) {
canvas.drawBitmap(checkedSeatBitmap, tempMatrix, paint);
//drawText(canvas, i, j, top, left);
} else if (isHave(i*column+j,2) ){
canvas.drawBitmap(unsureSeatBitmap, tempMatrix, paint);
}else{
canvas.drawBitmap(seatBitmap, tempMatrix, paint);
}
}
}
}
GestureDetector gestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
int x = (int) e.getX();
int y = (int) e.getY();
/* if(x==9&&y==1)
{
unsure();
}else{*/
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
int tempX = (int) ((j * seatWidth + j * spacing) * getMatrixScaleX() + getTranslateX());
int maxTempX = (int) (tempX + seatWidth * getMatrixScaleX());
int tempY = (int) ((seatHeight * i + i * verSpacing) * getMatrixScaleY() + getTranslateY());
int maxTempY = (int) (tempY + seatHeight * getMatrixScaleY());
if (x >= tempX && x <= maxTempX && y >= tempY && y <= maxTempY) {
if (isHave(i*column+j, 1)) {
remove(i*column+j, 1);
} else {
list.add(new Point(i*column+j, 1));
}
}
}
}
invalidate();
// }
return true;
}
});
protected void unsure()
{
for (Point point : list) {
if (point.y==1) {
list.add(new Point(point.x,2));
list.remove(point);
}
}
return;
}
public void setData(int row, int column) {
this.row = row;
this.column = column;
init();
invalidate();
}
}
下面是日志:
2019-05-28 16:33:35.138 6504-6504/com.example.movieticket E/InputEventReceiver: Exception dispatching input event.
2019-05-28 16:33:35.138 6504-6504/com.example.movieticket E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
2019-05-28 16:33:35.141 6504-6504/com.example.movieticket E/MessageQueue-JNI: java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.next(ArrayList.java:860)
at com.example.movieticket.MoveSeatView.unsure(MoveSeatView.java:212)
at com.example.movieticket.MoveSeatView.onTouchEvent(MoveSeatView.java:143)
at android.view.View.dispatchTouchEvent(View.java:12513)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2662)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2662)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2662)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2662)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2662)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2662)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830)
at android.app.Activity.dispatchTouchEvent(Activity.java:3400)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:398)
at android.view.View.dispatchPointerEvent(View.java:12752)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5106)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4909)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4642)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7092)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7061)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7022)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7195)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:186)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:326)
at android.os.Looper.loop(Looper.java:160)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-05-28 16:33:35.141 6504-6504/com.example.movieticket D/AndroidRuntime: Shutting down VM
2019-05-28 16:33:35.146 6504-6504/com.example.movieticket E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.movieticket, PID: 6504
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.next(ArrayList.java

有沒有大佬可以解決一下的,拜托了!!!
uj5u.com熱心網友回復:
我不知道是不是我這個函式一運行,中斷了那個實時更新的效果導致的閃退,沒學好,嗚嗚嗚uj5u.com熱心網友回復:
protected void unsure(){
for (Point point : list) {
if (point.y==1) {
list.add(new Point(point.x,2));
list.remove(point);
}
}
return;
}
集合在遍歷的時候是不能改變的(增刪都不可以),否則報錯
uj5u.com熱心網友回復:
解決了解決了,我的unsure沒寫好,不能邊添加邊洗掉,我改成while就好了轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/151280.html
標籤:Android
上一篇:qt lambada
下一篇:公眾平臺進不去,是不是又崩了?
