本文根据组件开发思想,首先介绍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文件中定义
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:id="@+id/incoming"
android:layout_width="match_parent"
android:layout_height="80dp">
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="挂断"/>
在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);
}
}
});
问题:图片大小以及屏幕适配可能会有些问题,如果使用,请注意测试。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。