package com.oppo.examples;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.skateboard.viewgroup.MyViewPager;
import com.skateboard.viewgroup.SbRelativeLayout;
import com.skateboard.viewgroup.SbRelativeLayout.TouchListener;
/***
*
* 模仿猿题库的情景题UI
* 猿题库的UI之一。双层view.重写RelativeLayout对截屏事件的处理,用子控件去滑动父控件视图。重写ViewPager事件的传递
* 。动态计算布局大小。要的可以找我。
*
* 卓佳群(Droidjia)221803017
*
* QQ:1083573260
* 欢迎您加入该群
*
* @author Lyy
*
*/
public class DraftTest extends Activity {
int screenWidth;
int screenHeight;
Button b;
private ListView listView;
private MyAdapter myAdapter;
private List data;
SbRelativeLayout liner;
private LinearLayout lastViewLiner;
int x, y;
int defaultHeight;
private MyViewPager viewPager;
private MyViewpagerAdapter myViewpagerAdapter;
View view;
MyView myView;
List viewData;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DisplayMetrics dm = getResources().getDisplayMetrics();
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels;
listView = (ListView) findViewById(R.id.listView);
dataInit();
lastViewLiner = (LinearLayout) findViewById(R.id.lastViewLiner);
liner = (SbRelativeLayout) findViewById(R.id.liner);
// 初始化上层view在屏幕中的位置
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
screenWidth, RelativeLayout.LayoutParams.FILL_PARENT);
lp.topMargin = 300;
liner.setLayoutParams(lp);
// 异步设置低层view的大小
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
int[] location = new int[2];
liner.getLocationOnScreen(location);
x = location[0];
y = location[1];
defaultHeight = y - 40;
RelativeLayout.LayoutParams PP = new RelativeLayout.LayoutParams(
screenWidth, defaultHeight);
lastViewLiner.setLayoutParams(PP);
}
}, 500);
// 监听动态改变视图信息
liner.setTouchListener(new TouchListener() {
@Override
public void backTouchState(int left, int top, int right, int bottom) {
// TODO Auto-generated method stub
RelativeLayout.LayoutParams PP = new RelativeLayout.LayoutParams(
screenWidth, top);
lastViewLiner.setLayoutParams(PP);
liner = (SbRelativeLayout) findViewById(R.id.liner);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
screenWidth, RelativeLayout.LayoutParams.FILL_PARENT);
lp.topMargin = top;
liner.setLayoutParams(lp);
}
});
viewPager = (MyViewPager) findViewById(R.id.viewPager);
myViewpagerAdapter = new MyViewpagerAdapter();
viewData = new ArrayList();
viewPager.setOffscreenPageLimit(0);
int img[] = { R.drawable.img0, R.drawable.img1 };
String[] content = { "我爱我家,我爱我媳妇。哈哈哈。。。。", "我们都是一个家名字叫中国,我爱我老婆" };
for (int i = 0; i
view = getLayoutInflater().inflate(R.layout.view, null);
myView = new MyView(view);
myView.setData(content[i], img[i]);
viewData.add(view);
}
myViewpagerAdapter.setViewadata(viewData);
viewPager.setAdapter(myViewpagerAdapter);
}
public void dataInit() {
data = new ArrayList();
for (int i = 0; i
data.add(i + 1 + "道题");
}
myAdapter = new MyAdapter(data);
listView.setAdapter(myAdapter);
}
public class MyAdapter extends BaseAdapter {
private List data;
public MyAdapter(List data) {
this.data = data;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return data.get(arg0);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
convertView = getLayoutInflater().inflate(R.layout.item, null);
TextView tv = (TextView) convertView.findViewById(R.id.textview);
tv.setText(data.get(position));
return convertView;
}
}
}<?xml version="1.0" encoding="utf-8"?>
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#fff"
android:orientation="vertical" >
android:id="@+id/lastViewLiner"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:listSelector="#00000000" >
android:id="@+id/liner"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="MD拖我呀"
android:textColor="#fff"
android:background="@drawable/xk_back_press_btn"
/>
android:id="@+id/viewPager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/btn"
/>
//==================package com.skateboard.viewgroup;
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import com.oppo.examples.R;
/**
*
* com.skateboard.viewgroup.SbRelativeLayout
*
* 在自定义View中,onLayout配合onMeasure方法一起使用,
* 可以实现自定义View的复杂布局。自定义View首先调用onMeasure进行测量,
* 然后调用onLayout方法,动态获取子View和子View的测量大小,然后进行layout布局
*
* @author Lyy
*
* 时间2015,7月20日
*
*/
public class SbRelativeLayout extends RelativeLayout {
private int screenWidth;
private int screenHeight;
// 滑板
private Button skateboard;
// 滑屏锁
private boolean mScrolling;
// 滑动监听
public TouchListener touchListener;
public SbRelativeLayout(Context context) {
super(context);
// TODO Auto-generated constructor stub
init();
}
public SbRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
// TODO Auto-generated constructor stub
}
public TouchListener getTouchListener() {
return touchListener;
}
public void setTouchListener(TouchListener touchListener) {
this.touchListener = touchListener;
}
public void init() {
DisplayMetrics dm = getResources().getDisplayMetrics();
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels;
}
/***
*
* 视图的初始化
*
*/
public void viewInit() {
skateboard = (Button) findViewById(R.id.btn);
skateboard.setOnTouchListener(onTouchListener);
this.setFocusable(true);
// this.setClickable(true);
}
/**
* 返回为ture ,被父控件拦截,触屏事件不会传递到子控件去处理,直接调用父容器的OnTouch方法
*
* 返回为假,让子控件去处理滑事件,子控件OnTouch返回为true, 不会再传递给父容器,为false 父控件处理滑屏事件
*
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// 拦截父控件滑屏
mScrolling = false;
break;
case MotionEvent.ACTION_MOVE:
mScrolling = false;
break;
case MotionEvent.ACTION_UP:
mScrolling = false;
break;
}
return mScrolling;
}
/***
*
* onLayout()就是设置每个子View在屏幕那个位置来显示出子View
*
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
super.onLayout(changed, l, t, r, b);
viewInit();
}
private OnTouchListener onTouchListener = new OnTouchListener() {
int lastX, lastY;
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
/**
* layout(l,t,r,b) l Left position, relative to parent t Top
* position, relative to parent r Right position, relative to parent
* b Bottom position, relative to parent
* */
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
int left = SbRelativeLayout.this.getLeft() + dx;
int top = SbRelativeLayout.this.getTop() + dy;
int right = SbRelativeLayout.this.getRight() + dx;
int bottom = SbRelativeLayout.this.getBottom() + dy;
if (left
left = 0;
right = left + SbRelativeLayout.this.getWidth();
}
if (right > screenWidth) {
right = screenWidth;
left = right - SbRelativeLayout.this.getWidth();
}
if (top
top = 0;
bottom = top + SbRelativeLayout.this.getHeight();
}
if (top > screenHeight - 80) {
break;
} else {
touchListener.backTouchState(left, top, right, bottom);
}
// if (bottom > screenHeight) {
// bottom = screenHeight;
// top = bottom - Rlienr.this.getHeight();
// }
// 改变视图的位置
SbRelativeLayout.this.layout(left, top, right, screenHeight);
//
// Log.e("------left---------" + left + "--top-" + top
// + "----right--" + right + "---bottom-" + bottom,
// "-------");
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
break;
}
return false;
}
};
/***
* Touch监听接口
*
* @author Lyy
*
*/
public interface TouchListener {
public void backTouchState(int left, int top, int right, int bottom);
}
}
//=============================
package com.skateboard.viewgroup;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/***
*
* 我的viewpager
*
* @author Lyy
* com.skateboard.viewgroup.MyViewPager
*/
public class MyViewPager extends ViewPager {
// 控制滑动的boolean锁
public boolean scrollable = false;
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollable(boolean enable) {
this.scrollable = enable;
}
float mDownX, mDownY;
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = event.getX();
mDownY = event.getY();
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
if (Math.abs(event.getX() - mDownX) > Math.abs(event.getY()
- mDownY)) {
getParent().requestDisallowInterceptTouchEvent(true);
} else {
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
getParent().requestDisallowInterceptTouchEvent(false);
break;
}
return super.dispatchTouchEvent(event);
}
}