android 自定义view 实现电影选座功能
生活随笔
收集整理的這篇文章主要介紹了
android 自定义view 实现电影选座功能
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
android 自定義view 實現(xiàn)電影選座功能
電影選座
繪制思路
1、現(xiàn)有的組件不能滿足我的需求
2、通過自定義view實現(xiàn)
3、繪制一個可方便方便設(shè)置每一行需要顯示的座位數(shù)量、顯示排數(shù)、點擊選擇/取消等功能的view
繪制步驟
1、繼承view
class MyGridView extends View
2、實現(xiàn)相應(yīng)的方法
3、繪制
a、初始化畫筆
private Paint paint = new Paint();//繪制圖片的畫筆private TextPaint textPaintXH = new TextPaint();//繪制序號的畫筆private TextPaint textPaint = new TextPaint();//繪制提示文字的畫筆textPaint.setColor(getResources().getColor(R.color.color_BF_BF_BF));textPaint.setTextSize(12);textPaintXH.setColor(getResources().getColor(R.color.color_D9_D9_D9));textPaintXH.setTextSize(12);b、初始化需要繪制的bitmap
private Bitmap checkBit;//選中的圖片private Bitmap uncheckBit;//未選中的圖片private Bitmap payed;//已售的圖片private Bitmap checkedBit;//選中的圖片說明checkBit = getImageSize2(2,R.drawable.in_check);uncheckBit = getImageSize2(2,R.drawable.write_check);payed = getImageSize2(2,R.drawable.gay_check);checkedBit = getImageSize2(2,R.drawable.red_check);c、設(shè)定一個默認(rèn)的座位的寬高
/默認(rèn)圖片的寬高private int defaultImgW = 80;private int defaultImgH = 80;d、繪制bitmap
canvas.drawBitmap(uncheckBit,left,top,paint);e、繪制文字
canvas.drawText(text,left,getBaseLine(textPaint,top,top+ceter),textPaint);f、繪制提示的色塊和文字
//繪制底部提示快canvas.drawBitmap(uncheckBit,3*defaultImgW,(cow+1)*defaultImgH,paint);canvas.drawText("未選",3*defaultImgW+uncheckBit.getWidth()+10,getBaseLine(textPaint,(cow+1)*defaultImgH,(cow+1)*defaultImgH+defaultImgH/2),textPaint);canvas.drawBitmap(payed,6*defaultImgW,(cow+1)*defaultImgH,paint);canvas.drawText("已售",6*defaultImgW+payed.getWidth()+10,getBaseLine(textPaint,(cow+1)*defaultImgH,(cow+1)*defaultImgH+defaultImgH/2),textPaint);canvas.drawBitmap(checkedBit,9*defaultImgW,(cow+1)*defaultImgH,paint);canvas.drawText("已選",9*defaultImgW+checkedBit.getWidth()+10,getBaseLine(textPaint,(cow+1)*defaultImgH,(cow+1)*defaultImgH+defaultImgH/2),textPaint);4、配置點擊事件并返回選中的座位集合
@Overridepublic boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN){int x = (int) event.getX();int y = (int) event.getY();for (Seat seat : list) {if (x>seat.getLeft()&&x<seat.getRight()&&y>seat.getTop()&&y<seat.getBottown()){if (seat.getCheckstaues()==0){seats.add(seat);}else {for (int i = 0; i < seats.size(); i++) {if (seats.get(i).getText().equals(seat.getText())){seats.remove(i);}}}oncheckClick.checked(seat.getText(),seats);}}}return true;}5、優(yōu)化
//縮放bitmapprivate Bitmap getImageSize2(int scall,int id){Bitmap srcBitmap= BitmapFactory.decodeResource(getResources(), id);Log.i("byte","srcbyte "+srcBitmap.getByteCount());Bitmap newBitmap =Bitmap.createBitmap(srcBitmap.getWidth()/scall,srcBitmap.getHeight()/scall, Bitmap.Config.ARGB_8888);Canvas canvas =new Canvas(newBitmap);//同時縮放會顯示原圖大小canvas.scale((1f/scall),(1f/scall));canvas.drawBitmap(srcBitmap,0,0,new Paint());Log.i("byte","newBitmap "+newBitmap.getByteCount());return newBitmap;}完整代碼
public class MyGridView extends View {private Paint paint = new Paint();//繪制圖片的畫筆private TextPaint textPaintXH = new TextPaint();//繪制序號的畫筆private TextPaint textPaint = new TextPaint();//繪制提示文字的畫筆private Context context;//上下文private ArrayList mList;//需要繪制的座位的集合private int cow = 0;//行數(shù)private int row = 0;//列數(shù)private Bitmap checkBit;//選中的圖片private Bitmap uncheckBit;//未選中的圖片private Bitmap payed;//已售的圖片private Bitmap checkedBit;//選中的圖片說明//默認(rèn)圖片的寬高private int defaultImgW = 80;private int defaultImgH = 80;List<Seat> list = new ArrayList<>();//存儲繪制的座位的信息List<Seat> checkedSeat = new ArrayList<>();//選中的座位信息private OncheckClick oncheckClick;public void setOncheckClick(OncheckClick oncheckClick) {this.oncheckClick = oncheckClick;}// List<T> mlist = new ArrayList<T>();public MyGridView(Context context) {super(context);this.context = context;}public MyGridView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);this.context = context;}public MyGridView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);this.context = context;}private int width=0;@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);width = getMeasuredWidth();}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {}@Overridepublic void draw(Canvas canvas) {super.draw(canvas);}@Overrideprotected void dispatchDraw(Canvas canvas) {super.dispatchDraw(canvas);this.canvas = canvas;initSetting();onDraws(canvas,context,row,cow);}private void initSetting() {if (mList!=null&&mList.size()>0){if (row>0){cow = (mList.size() /row) ;defaultImgW = width/(row+1);}}checkBit = getImageSize2(2,R.drawable.in_check);uncheckBit = getImageSize2(2,R.drawable.write_check);payed = getImageSize2(2,R.drawable.gay_check);checkedBit = getImageSize2(2,R.drawable.red_check);textPaint.setColor(getResources().getColor(R.color.color_BF_BF_BF));textPaint.setTextSize(12);textPaintXH.setColor(getResources().getColor(R.color.color_D9_D9_D9));textPaintXH.setTextSize(12);}public void setNum(int num){this.row = num;}public void setData(ArrayList mlist){this.mList = mlist;invalidate();}private Bitmap getImageSize2(int scall,int id){Bitmap srcBitmap= BitmapFactory.decodeResource(getResources(), id);Log.i("byte","srcbyte "+srcBitmap.getByteCount());Bitmap newBitmap =Bitmap.createBitmap(srcBitmap.getWidth()/scall,srcBitmap.getHeight()/scall, Bitmap.Config.ARGB_8888);Canvas canvas =new Canvas(newBitmap);//同時縮放會顯示原圖大小canvas.scale((1f/scall),(1f/scall));canvas.drawBitmap(srcBitmap,0,0,new Paint());Log.i("byte","newBitmap "+newBitmap.getByteCount());return newBitmap;}private int getBaseLine(Paint p, float top, float bottom) {Paint.FontMetrics fontMetrics = p.getFontMetrics();int baseLine = (int) ((bottom + top - fontMetrics.bottom - fontMetrics.top) / 2);return baseLine;}private Canvas canvas;@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);}public void UpDipmap(List<Seat> seat){this.checkedSeat = seat;invalidate();}private boolean istag = false;private void onDraws(Canvas canvas, Context context, int row, int cow) {list.clear();for (int i = 1; i <=cow+1; i++) {for (int j = 0; j <=row; j++) {istag= false;int left = (int) (j*defaultImgW);int top = (int) ((i-1)*defaultImgH);int right = left+defaultImgW;int bottown = top+defaultImgH;int ceter = defaultImgH/2;if (j==0){canvas.drawText(i+"",defaultImgW-20,getBaseLine(textPaint,top,top+ceter),textPaintXH);}else if (i*j<mList.size()){String seatnum = new StringBuilder().append(i).append("排").append(j).append("坐").toString();int num = j-1+((i-1)*row);Log.e("onDraws: ------",num+"" );if (num<mList.size()){Seat seat = new Seat();seat.setLeft(left);seat.setRight(right);seat.setTop(top);seat.setBottown(bottown);seat.setText(seatnum);seat.setPosition(num);String text = new StringBuilder().append(i).append(",").append(j).append(",").append(mList.get(num)).toString();if (checkedSeat.size()>0&&checkedSeat!=null){for (Seat seat1 : checkedSeat) {if (num == seat1.position ){istag = true;}}}if (istag){seat.setCheckstaues(1);canvas.drawBitmap(checkBit,left,top,paint);}else {seat.setCheckstaues(0);canvas.drawBitmap(uncheckBit,left,top,paint);}canvas.drawText(text,left,getBaseLine(textPaint,top,top+ceter),textPaint);list.add(seat);}}}}//繪制底部提示快canvas.drawBitmap(uncheckBit,3*defaultImgW,(cow+1)*defaultImgH,paint);canvas.drawText("未選",3*defaultImgW+uncheckBit.getWidth()+10,getBaseLine(textPaint,(cow+1)*defaultImgH,(cow+1)*defaultImgH+defaultImgH/2),textPaint);canvas.drawBitmap(payed,6*defaultImgW,(cow+1)*defaultImgH,paint);canvas.drawText("已售",6*defaultImgW+payed.getWidth()+10,getBaseLine(textPaint,(cow+1)*defaultImgH,(cow+1)*defaultImgH+defaultImgH/2),textPaint);canvas.drawBitmap(checkedBit,9*defaultImgW,(cow+1)*defaultImgH,paint);canvas.drawText("已選",9*defaultImgW+checkedBit.getWidth()+10,getBaseLine(textPaint,(cow+1)*defaultImgH,(cow+1)*defaultImgH+defaultImgH/2),textPaint);}private List<Seat> seats = new ArrayList<>();@Overridepublic boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN){int x = (int) event.getX();int y = (int) event.getY();for (Seat seat : list) {if (x>seat.getLeft()&&x<seat.getRight()&&y>seat.getTop()&&y<seat.getBottown()){if (seat.getCheckstaues()==0){seats.add(seat);}else {for (int i = 0; i < seats.size(); i++) {if (seats.get(i).getText().equals(seat.getText())){seats.remove(i);}}}oncheckClick.checked(seat.getText(),seats);}}}return true;}interface OncheckClick{void checked(String text,List<Seat> seats);}class Seat{private int left ;private int top ;private int right ;private int bottown;private String text;private int position;private int checkstaues;public int getCheckstaues() {return checkstaues;}public void setCheckstaues(int checkstaues) {this.checkstaues = checkstaues;}public int getLeft() {return left;}public void setLeft(int left) {this.left = left;}public int getTop() {return top;}public void setTop(int top) {this.top = top;}public int getRight() {return right;}public void setRight(int right) {this.right = right;}public int getBottown() {return bottown;}public void setBottown(int bottown) {this.bottown = bottown;}public String getText() {return text;}public void setText(String text) {this.text = text;}public int getPosition() {return position;}public void setPosition(int position) {this.position = position;}} }總結(jié)
以上是生活随笔為你收集整理的android 自定义view 实现电影选座功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米597页招股书中的数据干货,全在这里
- 下一篇: java求阶乘1-20_java求1+2