Android自定义View实现选座功能

我们在安卓开发中安卓自带的控件满足不了我们的需求,因此我们就需要用到自定义View来满足我们的需求,在这里我要讲解的是自定义View实现选座功能,在安卓中一个会使用自定义View的人一定会开发出与众不同以及美观的项目
首先,我展示一下效果

以上主要就是我们需要创建一个我们自己的View继承自Viewgroup控件并实现onMeasure以及onDraw方法
具体的代码是这样的

public class SearView extends ViewGroup {
  private Context context;
  public SearView(@NonNull Context context) {
    super(context);
  }

  public SearView(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    this.context=getContext();
  }

  public SearView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }

  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b) {

  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

  }
  private ArrayList<SeatinfoBean.ResultBean> mlist;
  public void setData(ArrayList<SeatinfoBean.ResultBean> list){
    this.mlist = list;
    invalidate();
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (mlist != null && mlist.size() > 0) {
      for (int i = 0; i < mlist.size(); i++) {
        SeatinfoBean.ResultBean resultBean = mlist.get(i);
        resultBean.draw(canvas,context);
      }
    }
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()){
      case MotionEvent.ACTION_DOWN:

        break;
      case MotionEvent.ACTION_MOVE:
        break;
      case MotionEvent.ACTION_UP:

        float x = event.getX();
        float y = event.getY();
        completeByXY(x,y);
        break;
    }
    return true;
  }
  public void completeByXY(float x,float y){
    for (int i=0;i<mlist.size();i++){
      SeatinfoBean.ResultBean resultBean1 = mlist.get(i);
      int left = resultBean1.getLeft();
      int right = resultBean1.getRight();
      int bottom = resultBean1.getBottom();
      int top = resultBean1.getTop();
      if (x>=left&&x<right&&y>=top&&y<=bottom){
        clickedSeat.clickedSeat(resultBean1);
        int status = resultBean1.getStatus();
        if (status==1){
          status=3;
          resultBean1.setStatus(status);
        }else if (status==3){
          status=1;
          resultBean1.setStatus(status);
        }
        break;
      }
    }
    postInvalidate();
  }
  public interface ClickedSeat{
    void clickedSeat(SeatinfoBean.ResultBean resultBean);
  }
  private ClickedSeat clickedSeat;

  public void setClickedSeat(ClickedSeat clickedSeat) {
    this.clickedSeat = clickedSeat;
  }
}

以上的resultBean是我们根据选座接口中的返回值判断座位是否已经被选,大家可以参考一下我的Bean类,但具体的做法还要以自己的接口文件为主

public static class ResultBean {
    /**
     * row : 1
     * seat : 1
     * status : 2
     */

    private String row;
    private String seat;
    private int status;
    private int left;
    private int top;
    private int right;
    private int bottom;
    private Context context;
    private boolean ist = false;

    public String getRow() {
      return row;
    }

    public void setRow(String row) {
      this.row = row;
    }

    public String getSeat() {
      return seat;
    }

    public void setSeat(String seat) {
      this.seat = seat;
    }

    public int getStatus() {
      return status;
    }

    public void setStatus(int status) {
      this.status = status;
    }

    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 getBottom() {
      return bottom;
    }

    public void setBottom(int bottom) {
      this.bottom = bottom;
    }

    public Context getContext() {
      return context;
    }

    public void setContext(Context context) {
      this.context = context;
    }

    public boolean isIst() {
      return ist;
    }

    public void setIst(boolean ist) {
      this.ist = ist;
    }
    public void draw(Canvas canvas,Context context){
      if (status==2){
        BitmapDrawable drawable = (BitmapDrawable) context.getResources().getDrawable(R.drawable.xuan);
        Bitmap bitmap = drawable.getBitmap();
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int row = Integer.parseInt(getRow());
        int seat = Integer.parseInt(getSeat());
        row = row*50;
        seat = seat*50;
        canvas.drawBitmap(bitmap,seat,row,new Paint());
        left = seat;
        top = row;
        right = seat+width;
        bottom = row+height;
      }
      if (status==1){
        BitmapDrawable drawable = (BitmapDrawable) context.getResources().getDrawable(R.drawable.xuan1);
        Bitmap bitmap = drawable.getBitmap();
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int row = Integer.parseInt(getRow());
        int seat = Integer.parseInt(getSeat());
        row = row*50;
        seat = seat*50;
        canvas.drawBitmap(bitmap,seat,row,new Paint());
        left = seat;
        top = row;
        right = seat+width;
        bottom = row+height;
      }
      if (status==3){
        BitmapDrawable drawable = (BitmapDrawable) context.getResources().getDrawable(R.drawable.xuan3);
        Bitmap bitmap = drawable.getBitmap();
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int row = Integer.parseInt(getRow());
        int seat = Integer.parseInt(getSeat());
        row = row*50;
        seat = seat*50;
        canvas.drawBitmap(bitmap,seat,row,new Paint());
        left = seat;
        top = row;
        right = seat+width;
        bottom = row+height;
      }
    }
  }
}

最后,我们需要在布局文件里进行调用,我的布局文件是这样的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".activity.XuanZuoActivity"
  android:orientation="vertical">
  <TextView
    android:id="@+id/xuanzuotext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="请开始选座购票"
    android:background="#140404"
    android:gravity="center"
    android:textSize="@dimen/permission_dp_30"
    android:textColor="#fff"/>
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="#140404">
    <TextView
      android:id="@+id/weixuan"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="未选座"
      android:textColor="#fff"
      android:layout_marginLeft="@dimen/permission_dp_20"
      android:layout_marginTop="@dimen/dp_3"/>
    <ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:src="@drawable/xuan1"/>
    <TextView
      android:id="@+id/weixuan2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="已选座"
      android:textColor="#fff"
      android:layout_marginLeft="@dimen/dp_210"
      android:layout_marginTop="@dimen/dp_3"/>
    <ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:src="@drawable/xuan"/>
  </LinearLayout>
  <com.bw.movie.SearView
    android:id="@+id/xuanzuo"
    android:background="#140404"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dp_0"
    android:layout_weight="6"
    />

  <Button
    android:id="@+id/button_xuanzuo"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dp_0"
    android:layout_weight="0.5"
    android:text="立即支付"
    android:background="#E91E63"/>

</LinearLayout>

以上就是我的选座功能实现的全过程,欢迎大家提问

总结

到此这篇关于Android自定义View实现选座功能的文章就介绍到这了,更多相关android自定义view选座内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android实现电影院选座效果

    本文实例为大家分享了Android实现电影院选座效果展示的具体代码,供大家参考,具体内容如下 这是一个简单的电影院选座效果,实现该效果大致分为三步: 1.自定义view进行绘制: 2.手势缩放效果的实现: 3.手势触摸被选和未被选效果的实现: 先来看第一步,效果的绘制: public class MoveSeatView extends View { private final boolean DBG = false; private Paint paint = new Paint(); pri

  • Android自定义View实现点赞控件

    本文实例为大家分享了Android点赞控件的具体代码,供大家参考,具体内容如下 预览效果 目录 图片类:LikeImageView 文字类:LikeCharTextView 整合类:LikeView.java 自定义属性:attrs.xml 代码 LikeCharTextView public class LikeCharTextView extends View { public static final int DEFAULT_TEXTCOLOR = Color.BLACK; public

  • Android自定义View实现投票进度条

    本文实例为大家分享了Android投票进度条的具体代码,供大家参考,具体内容如下 效果展示 功能属性介绍 <!-- MatchSupportProgressBar --> <declare-styleable name="MatchSupportProgressBar"> <!-- 进度条圆角角度 --> <attr name="progress_radio" format="string"><

  • Android自定义view实现电影票在线选座功能

    先看看电影票在线选座功能实现的效果图: 界面比较粗糙,主要看原理. 这个界面主要包括以下几部分 1.座位 2.左边的排数 3.左上方的缩略图 4.缩略图中的红色区域 5.手指移动时跟随移动 6.两个手指缩放时跟随缩放 主要技术点 1.矩阵Matrix 2.GestureDetector与ScaleGestureDetector 3.Bitmap的一下基本用法 4.这里只需要重写view的onDraw就可实现全部功能 可以发现这个其实没什么难度,主要就是一些位置的计算. 为了能便于理解首先把要用到

  • Android打造炫酷的电影票在线选座app在线选座功能

    不知道大家有没有用过,淘宝电影客户端(淘票票)买过电影票,纵观各类在线选座app的在线选座功能 淘宝在线选座功能用户体验最好,用起来最顺手,夸张点说已经到了炉火纯青的地步,下面我们看一下效果: 效果分析: 整个控件分成几个部分,座位图区域.座位缩略图区域.行号区域.屏幕区域 1.座位图可以自由的移动缩放,放大缩小移动后会自动回弹到合适的位置,选中座位会自动放大到合适比例. 2.行号部分跟着座位图缩放以及上下移动,屏幕区域跟着座位图左右移动缩放. 3.当手指按下的时候会出现缩略图,缩略图上有个红色

  • Android自定义View实现选座功能

    我们在安卓开发中安卓自带的控件满足不了我们的需求,因此我们就需要用到自定义View来满足我们的需求,在这里我要讲解的是自定义View实现选座功能,在安卓中一个会使用自定义View的人一定会开发出与众不同以及美观的项目 首先,我展示一下效果 以上主要就是我们需要创建一个我们自己的View继承自Viewgroup控件并实现onMeasure以及onDraw方法 具体的代码是这样的 public class SearView extends ViewGroup { private Context co

  • Android自定义View实现简易画板功能

    本文实例为大家分享了Android自定义View实现简易画板的具体代码,供大家参考,具体内容如下 自定义VIew实现简易画板效果,功能包括清空.选择颜色,选择大小,效果如下 画板布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:t

  • Android自定义View实现自动吸附功能

    本文实例为大家分享了Android实现自动吸附功能的具体代码,供大家参考,具体内容如下 1.简述 最近开发app过程中要实现拖动view后要可以自动吸附功能,所以需要自定义view来在onTouchEvent中来利用动画来实现此功能 2.功能代码部分 import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.util.Log; i

  • Android 自定义View实现多节点进度条功能

    前言 最近项目有一个节点进度条的小需求,完成后,想分享出来希望可以帮到有需要的同学. 真机效果图 自定义View完整代码 开箱即用~,注释已经炒鸡详细了 /** * @description: 节点进度条 * @author: DMingO * @date: 2020/4/15 */ public class PointProcessBar extends View { /** * 未选中时的连线画笔 */ private Paint mLinePaint; /** * 选中时的连线画笔 */

  • Android自定义View实现照片裁剪框与照片裁剪功能

    本文所需要实现的就是这样一种有逼格的效果: 右上角加了个图片框,按下确定可以裁剪正方形区域里的图片并显示在右上角. 实现思路: 1:首先需要自定义一个ZoomImageView来显示我们需要的图片,这个View需要让图片能够以合适的位置展现在当前布局的图片展示区域内(合适的位置值的是:如果图片长度大于屏幕,则压缩图片长度至屏幕宽度,高度等比压缩并居中显示,如果图片高度大于屏幕,则压缩图片高度至屏幕高度,长度等比压缩并居中显示.): 2:然后需要实现这个拖动的框框,该框框实现的功能有四点:拖动.扩

  • Android自定义View 实现闹钟唤起播放闹钟铃声功能

    先上图看一下闹钟唤期页面的效果 实现的功能: 1:转动的图片根据天气情况更换 2:转动时间可以设置,转动结束,闹铃声音就结束 3:光圈颜色渐变效果 直接上代码啦: package com.yuekong.sirius.extension.customview; import android.animation.Animator; import android.animation.ValueAnimator; import android.content.Context; import andro

  • Android自定义View仿支付宝输入六位密码功能

    跟选择银行卡界面类似,也是用一个PopupWindow,不过输入密码界面是一个自定义view,当输入六位密码完成后用回调在Activity中获取到输入的密码并以Toast显示密码.效果图如下: 自定义view布局效果图及代码如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/

  • Android自定义View展开菜单功能的实现

    先给大家展示下效果图,如果大家感觉不错,请参考实现代码. 思路 1.下角Button的父View加入一个FrameLayout,也就是图中全屏透明灰色部分. 菜单没有弹出的时候设置为不可见. 设置FrameLayout点击事件,点击的时候缩回菜单. 对应init() 2.rameLayout中加入菜单按钮,也就是弹出的那三个. 菜单没有弹出的时候设置为不可见. 对应addElement()和freshElement() 3.右下角的按钮,旋转图标(也可以不旋转). 对应setRotateAnim

随机推荐