Android自定义滑动接听电话控件组实例

本文根据组件开发思想,首先介绍android自定义控件,然后将自定义的控件封装为jar包。最为实现滑动接听电话控件组。

一、目录结构

二、运行效果

三、代码实现

首先,自定义一个类IncomingPhone继承RelativeLayout

public IncomingPhone(Context context, AttributeSet attrs) {
    super(context, attrs);
    mContext = context;
    TextView textView = new TextView(mContext);
    textView.setText("caonima");
    pickUpView = new PickUpView(mContext);
    hangUpView = new HangUpView(mContext);
    pickUpView.setBackground(getResources().getDrawable(R.drawable.pick_up_background));
    hangUpView.setBackground(getResources().getDrawable(R.drawable.hang_up_background));
    RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    lp1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
/    pickUpView.setBackground(mContext.getDrawable(R.drawable.pick_up_background));
    pickUpView.setPickUpListener(new PickUpView.PickUpListener() {
      @Override
      public void pickUpEvent() {
        mIncomingPhoneResultListener.incomingPhoneResultEvent("PICKUP");
      }
    });
    hangUpView.setHangUpListener(new HangUpView.HangUpListener() {
      @Override
      public void hangUpEvent() { 

        mIncomingPhoneResultListener.incomingPhoneResultEvent("HANGUP");
      }
    });
    pickUpView.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:
            hangUpView.setVisibility(View.GONE);
            break;
          case MotionEvent.ACTION_UP:
            hangUpView.setVisibility(View.VISIBLE);
            pickUpView.setVisibility(View.VISIBLE);
            break;
          default:
            break;
        }
        return false;
      }
    });
    hangUpView.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:
            pickUpView.setVisibility(View.GONE);
            break;
          case MotionEvent.ACTION_UP:
            hangUpView.setVisibility(View.VISIBLE);
            pickUpView.setVisibility(View.VISIBLE);
            break;
          default:
            break;
        }
        return false;
      }
    });
    addView(textView);
    addView(pickUpView);
    addView(hangUpView,lp1);
  }

构造函数中添加子控件,并添加滑动事件以及监听器,其中PickUpView、HangUpView是自定义的子控件,是该类的内部类两个几乎一样,我贴出其中一个

class PickUpView extends RelativeLayout {
  private Context mContext;
  private final int minWidth = 360;
  private int screenWidth;
  private int mWidth;
  private int mHeight;
  private PickUpListener mPickUpListener; 

  public void setPickUpListener(PickUpListener mPickUpListener) {
    this.mPickUpListener = mPickUpListener;
  } 

  public int getmWidth() {
    mWidth = getLayoutParams().width;
    return mWidth;
  } 

  public void setmWidth(int width) {
    mWidth = width;
    getLayoutParams().width = mWidth;
    requestLayout();
  } 

  public int getmHeight() {
    mHeight = getLayoutParams().height;
    return mHeight;
  } 

  public void setmHeight(int height) {
    mHeight = height;
    getLayoutParams().height = mHeight;
    requestLayout();
  }
  public PickUpView(Context context) { 

    super(context);
    WindowManager wm = (WindowManager) getContext()
        .getSystemService(Context.WINDOW_SERVICE); 

    screenWidth = wm.getDefaultDisplay().getWidth();
  } 

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    int firstX = 0;
    int lastX = 0;
    mWidth = getmWidth();
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        firstX = (int) event.getX();
//        ObjectAnimator.ofInt(this,"mWidth",500).setDuration(5000).start();
        break;
      case MotionEvent.ACTION_MOVE:
        lastX = (int) event.getX();
        setmWidth(lastX);
//        Log.e("起始坐标", String.valueOf(firstX));
//        Log.e("结束坐标", String.valueOf(lastX));
        break;
      case MotionEvent.ACTION_UP:
        lastX = (int) event.getRawX();
        if (lastX > screenWidth / 7 * 6) {
          mPickUpListener.pickUpEvent();
        } else {
          setmWidth(minWidth);
        }
        break;
      default:
        break;
    }
    return true;
  } 

  public interface PickUpListener {
    public void pickUpEvent();
  }
}

在XML文件中定义

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <com.example.administrator.pickuptest.IncomingPhone
      android:id="@+id/incoming"
      android:layout_width="match_parent"
      android:layout_height="80dp">
    </com.example.administrator.pickuptest.IncomingPhone>
    <Button
      android:id="@+id/btn_hang_up"
      android:layout_margin="10dp"
      android:background="#ff0000"
      android:textColor="#ffffff"
      android:visibility="gone"
      android:layout_width="match_parent"
      android:layout_height="80dp"
      android:text="挂断"/>
  </RelativeLayout>

在Activity中使用

incomingPhone = (IncomingPhone)findViewById(R.id.incoming);
mBtnHangUp=(Button)findViewById(R.id.btn_hang_up);
incomingPhone.setIncomingPhoneResultListener(new IncomingPhone.IncomingPhoneResultListener() {
  @Override
  public void incomingPhoneResultEvent(String result) {
    if ("PICKUP".equals(result)){
      Log.e("", "打电话");
      incomingPhone.setVisibility(View.GONE);
      mBtnHangUp.setVisibility(View.VISIBLE);
    }
    else {
      Log.e("","挂电话");
      incomingPhone.setVisibility(View.GONE);
      mBtnHangUp.setVisibility(View.VISIBLE);
    }
  }
});

问题:图片大小以及屏幕适配可能会有些问题,如果使用,请注意测试。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android仿微信列表滑动删除之可滑动控件(一)

    这次是列表滑动删除的第三波,仿微信的列表滑动删除.先上个效果图: 前面的文章里面说过开源框架SwipeListView的实现原理是每个列表item中包含上下两层view,普通状态下上层的view覆盖着下层的view,当用户滑开上层的view,下层的view就显示出来了.但是仔细观察微信列表的item,很明显并非这个实现方案,微信的item应该一个单层view,只不过这个item超出了所在的ListView的宽度,在用户滑动item的时候,item超出屏幕的view则会显示在屏幕之上,这种滑动实现

  • Android控件之SlidingDrawer(滑动式抽屉)详解与实例分享

    SlidingDrawer效果想必大家也见到过,它就是1.5模拟器上进入应用程序列表的效果.下面是截图 一.简介  SlidingDrawer隐藏屏外的内容,并允许用户通过handle以显示隐藏内容.它可以垂直或水平滑动,它有俩个View组成,其一 是可以拖动的handle,其二是隐藏内容的View.它里面的控件必须设置布局,在布局文件中必须指定handle和content.例如下面 复制代码 代码如下: <SlidingDrawer android:layout_width="fill_

  • Android自定义控件实现可左右滑动的导航条

    先上效果图: 这个控件其实算是比较轻量级的,相信不少小伙伴都能做出来.因为项目中遇到了一些特殊的定制要求,所以就自己写了一个,这里放出来.  首先来分析下这个控件的功能:  •能够响应左右滑动,并且能响应快速滑动 •选择项和未选择项有不同的样式表现,比如前景色,背景色,字体大小变粗之内的 •在切换选项的时候,如果当前选项未完全呈现在界面前,则自动滚动直至当前选项完全暴露显示 前两条还有,简简单单就实现了,主要是第三点,这才是我自定义这个控件的原因!那么如果要实现这个控件,需要用到哪些知识呢? 

  • Android自定义控件实现滑动开关效果

    自定义开关控件 Android自定义控件一般有三种方式 1.继承Android固有的控件,在Android原生控件的基础上,进行添加功能和逻辑. 2.继承ViewGroup,这类自定义控件是可以往自己的布局里面添加其他的子控件的. 3.继承View,这类自定义控件没有跟原生的控件有太多的相似的地方,也不需要在自己的肚子里添加其他的子控件. ToggleView自定义开关控件表征上没有跟Android原生的控件有什么相似的地方,而且在滑动的效果上也没有沿袭Android原生的地方,所以我们的自定义

  • Android实现IOS相机滑动控件

    IOS相比于Android,动画效果是一方面优势,IOS相机切换时滑动的动画很不错,看着是有一个3D的效果,而且变化感觉很自然.Android也可以通过Graphics下面的Camera可以实现3D效果,开始尝试着用这个做了一下,效果不理想,滑动之后各组文字之间的距离就变了,从立体空间来说这是合逻辑的,但是看着很别捏.IOS相机的滑动效果文字之间的间隔在滑动的时候是不变的. 后面通过调整TextView X方向的scale使文字看着紧凑一点,然后通过计算的距离的方式,在滑动的时候保持各组文字之间

  • Android开源堆叠滑动控件仿探探效果

    堆叠滑动控件,类似于社交软件探探的效果,并增加以下扩展: 支持滑动方向控制 支持消失方向控制 支持嵌入到ViewPager等滑动控件 支持内嵌ListView,RecycleView等滑动控件 效果演示 如何使用 xml引入StackCardsView: <com.beyondsw.lib.widget.StackCardsView android:id="@+id/cards" android:layout_width="match_parent" andr

  • Android控件SeekBar仿淘宝滑动验证效果

    SeekBar是一个拖动条控件,最简单的案例就是我们的调节音量,还有音频视频的播放,传统的SeekBar样式,如图 传统的实现太简单,不足以让我们到能装逼的地步.本来是打算实现滴滴出行滑动完成订单的效果,可惜找不到效果图,今天也就用淘宝的滑动验证来作为实例 1.1 实现分析 SeekBar:使用progressDrawable属性自定义SeekBar 拖动块:使用thumb属性更改,其实就是一张图片 文字:使用RelativeLayout嵌套在一起 1.2 实现布局 <?xml version=

  • Android实现果冻滑动效果的控件

    前言 在微信是的处理方法是让用户滑动,但最终还是回滚到最初的地方,这样的效果很生动(毕竟成功还是取决于细节).那么在安卓我们要怎么弄呢.下面为大家介绍一下JellyScrollView,是我继承ScrollView的一个有阻尼的效果的果冻滑动控件. 下面话不多说了,先来看看效果图 (在虚拟机或者真机跑起来是很流畅,可能是录制视频做成gif的时候有点卡顿.) 实现原理 其实只需要重写下它的拦截方法的逻辑就好了,ScrollView的拦截方法onInterceptTouchEvent一般情况下都默认

  • 使用Android自定义控件实现滑动解锁九宫格

    本文概述:  滑动解锁九宫格的分析: 1.需要自定义控件: 2.需要重写事件onTouchEvent(); 3.需要给九个点设置序号和坐标,这里用Map类就行: 4.需要判断是否到滑到过九点之一,并存储滑到过的点的序号,而且需要一个方法可以返回它们,这里用List类就行: 滑动解锁当前还是比较流行的,今天写了个简单的滑动解锁九宫格的例程,分享出来让初学者看看. 我的是这样的: Demo 首先,自定义一个View /** * 九宫格 */ public class NineGridView ext

  • Android自定义View实现随手势滑动控件

    本文控件为大家分享了Android随手势滑动控件的具体代码,供大家参考,具体内容如下 1.新建自定义控件类:MyView public class MyView extends Button{ //记录上次滑动后的坐标值 private int lastX; private int lastY; public MyView(Context context) { super(context); // TODO Auto-generated constructor stub } public MyV

随机推荐