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);

}

}

AAffA0nNPuCLAAAAAElFTkSuQmCCAAffA0nNPuCLAAAAAElFTkSuQmCC

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐