添加了自定义控件打星星
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
package com.kykj.inspection.adapter;
|
package com.kejiang.yuandl.adapter;
|
||||||
|
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v4.app.FragmentActivity;
|
import android.support.v4.app.FragmentActivity;
|
||||||
@@ -18,7 +18,7 @@ public class FragmentTabAdapter implements OnCheckedChangeListener {
|
|||||||
private FragmentActivity fragmentActivity; // Fragment所属的Activity
|
private FragmentActivity fragmentActivity; // Fragment所属的Activity
|
||||||
private int fragmentContentId; // Activity中所要被替换的区域的id
|
private int fragmentContentId; // Activity中所要被替换的区域的id
|
||||||
|
|
||||||
private int currentTab =0;// 当前Tab页面索引
|
private int currentTab = 0;// 当前Tab页面索引
|
||||||
|
|
||||||
private OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener; // 用于让调用者在切换tab时候增加新的功能
|
private OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener; // 用于让调用者在切换tab时候增加新的功能
|
||||||
|
|
||||||
@@ -32,8 +32,8 @@ public class FragmentTabAdapter implements OnCheckedChangeListener {
|
|||||||
FragmentTransaction ft = fragmentActivity.getSupportFragmentManager()
|
FragmentTransaction ft = fragmentActivity.getSupportFragmentManager()
|
||||||
.beginTransaction();
|
.beginTransaction();
|
||||||
ft.add(fragmentContentId, fragments.get(currentTab));
|
ft.add(fragmentContentId, fragments.get(currentTab));
|
||||||
ft.commit();
|
ft.commitAllowingStateLoss();
|
||||||
if(rg!=null){
|
if (rg != null) {
|
||||||
rg.setOnCheckedChangeListener(this);
|
rg.setOnCheckedChangeListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,18 +46,21 @@ public class FragmentTabAdapter implements OnCheckedChangeListener {
|
|||||||
if (rg.getChildAt(i).getId() == checkedId) {
|
if (rg.getChildAt(i).getId() == checkedId) {
|
||||||
Fragment fragment = fragments.get(i);
|
Fragment fragment = fragments.get(i);
|
||||||
FragmentTransaction ft = obtainFragmentTransaction(i);
|
FragmentTransaction ft = obtainFragmentTransaction(i);
|
||||||
// getCurrentFragment().onPause(); // 暂停当前tab
|
// getCurrentFragment().onPause(); // 暂停当前tab
|
||||||
//getCurrentFragment().onStop(); // 暂停当前tab
|
//getCurrentFragment().onStop(); // 暂停当前tab
|
||||||
|
|
||||||
if (fragment.isAdded()) {
|
if (fragment.isAdded()) {
|
||||||
// fragment.onStart(); // 启动目标tab的onStart()
|
// fragment.onStart(); // 启动目标tab的onStart()
|
||||||
currentTab=i;
|
currentTab = i;
|
||||||
fragment.onResume(); // 启动目标tab的onResume()
|
if (!fragment.isResumed()) {
|
||||||
|
|
||||||
|
fragment.onResume(); // 启动目标tab的onResume()
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ft.add(fragmentContentId, fragment);
|
ft.add(fragmentContentId, fragment);
|
||||||
}
|
}
|
||||||
showTab(i); // 显示目标tab
|
showTab(i); // 显示目标tab
|
||||||
ft.commit();
|
ft. commitAllowingStateLoss();
|
||||||
|
|
||||||
// 如果设置了切换tab额外功能功能接口
|
// 如果设置了切换tab额外功能功能接口
|
||||||
if (null != onRgsExtraCheckedChangedListener) {
|
if (null != onRgsExtraCheckedChangedListener) {
|
||||||
@@ -85,7 +88,7 @@ public class FragmentTabAdapter implements OnCheckedChangeListener {
|
|||||||
} else {
|
} else {
|
||||||
ft.hide(fragment);
|
ft.hide(fragment);
|
||||||
}
|
}
|
||||||
ft.commit();
|
ft.commitAllowingStateLoss();
|
||||||
}
|
}
|
||||||
currentTab = idx; // 更新目标tab为当前tab
|
currentTab = idx; // 更新目标tab为当前tab
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ import android.widget.ProgressBar;
|
|||||||
import android.widget.RatingBar;
|
import android.widget.RatingBar;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.zhy.autolayout.utils.AutoUtils;
|
||||||
|
|
||||||
public class ViewHolder extends RecyclerView.ViewHolder {
|
public class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
private SparseArray<View> mViews;
|
private SparseArray<View> mViews;
|
||||||
private int mPosition;
|
private int mPosition;
|
||||||
@@ -37,6 +39,7 @@ public class ViewHolder extends RecyclerView.ViewHolder {
|
|||||||
mConvertView = itemView;
|
mConvertView = itemView;
|
||||||
mPosition = position;
|
mPosition = position;
|
||||||
mViews = new SparseArray<View>();
|
mViews = new SparseArray<View>();
|
||||||
|
AutoUtils.autoSize(mConvertView);
|
||||||
mConvertView.setTag(this);
|
mConvertView.setTag(this);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import android.view.Gravity;
|
|||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.view.Window;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
@@ -240,7 +241,7 @@ public abstract class BaseActivity extends AutoLayoutActivity implements View.On
|
|||||||
* 提供是否显示提交按钮
|
* 提供是否显示提交按钮
|
||||||
*
|
*
|
||||||
* @param title 文字
|
* @param title 文字
|
||||||
* @param show true则显示
|
* @param show true则显示
|
||||||
*/
|
*/
|
||||||
protected void showForwardView(CharSequence title, boolean show) {
|
protected void showForwardView(CharSequence title, boolean show) {
|
||||||
if (mForwardButton != null) {
|
if (mForwardButton != null) {
|
||||||
@@ -609,11 +610,22 @@ public abstract class BaseActivity extends AutoLayoutActivity implements View.On
|
|||||||
listView.setEmptyView(emptyView);
|
listView.setEmptyView(emptyView);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void setEmptyView(ListView listView, String text) {
|
||||||
|
TextView emptyView = new TextView(context);
|
||||||
|
emptyView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||||
|
emptyView.setText(text);
|
||||||
|
emptyView.setGravity(Gravity.CENTER);
|
||||||
|
emptyView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
|
||||||
|
emptyView.setVisibility(View.GONE);
|
||||||
|
((ViewGroup) listView.getParent()).addView(emptyView);
|
||||||
|
listView.setEmptyView(emptyView);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
mContentLayout.removeAllViews();
|
mContentLayout.removeAllViews();
|
||||||
mContentLayout=null;
|
mContentLayout = null;
|
||||||
AppManager.getAppManager().finishActivity(this);
|
AppManager.getAppManager().finishActivity(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,9 @@ public class AppManager {
|
|||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Stack<Activity> getAllActivitys() {
|
||||||
|
return activityStack;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* 栈中是否为空
|
* 栈中是否为空
|
||||||
*
|
*
|
||||||
@@ -69,6 +72,17 @@ public class AppManager {
|
|||||||
}
|
}
|
||||||
return activityStack.get(activityStack.size() - 1);
|
return activityStack.get(activityStack.size() - 1);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 获取前一个activity,便于返回
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Activity previousActivity() {
|
||||||
|
if (activityStack.size() < 2) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return activityStack.get(activityStack.size() - 2);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 结束当前Activity(堆栈中最后一个压入的)
|
* 结束当前Activity(堆栈中最后一个压入的)
|
||||||
@@ -158,6 +172,7 @@ public class AppManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 结束所有Activity保留登录界面
|
* 结束所有Activity保留登录界面
|
||||||
*/
|
*/
|
||||||
@@ -167,13 +182,14 @@ public class AppManager {
|
|||||||
for (int i = 0, size = activityList.size(); i < size; i++) {
|
for (int i = 0, size = activityList.size(); i < size; i++) {
|
||||||
Activity activity = activityList.get(i);
|
Activity activity = activityList.get(i);
|
||||||
if (null != activityList.get(i)) {
|
if (null != activityList.get(i)) {
|
||||||
if(!activityList.get(i).getClass().getSimpleName().equals("UserSetActivity")) {
|
if (!activityList.get(i).getClass().getSimpleName().equals("UserSetActivity")) {
|
||||||
activityList.get(i).finish();
|
activityList.get(i).finish();
|
||||||
activityStack.remove(activity);
|
activityStack.remove(activity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 退出应用程序
|
* 退出应用程序
|
||||||
*/
|
*/
|
||||||
@@ -182,7 +198,7 @@ public class AppManager {
|
|||||||
finishAllActivity();
|
finishAllActivity();
|
||||||
// MyApplication.getInstance().unregisterReceiver();
|
// MyApplication.getInstance().unregisterReceiver();
|
||||||
/*
|
/*
|
||||||
* ActivityManager activityMgr= (ActivityManager)
|
* ActivityManager activityMgr= (ActivityManager)
|
||||||
* context.getSystemService(Context.ACTIVITY_SERVICE);
|
* context.getSystemService(Context.ACTIVITY_SERVICE);
|
||||||
* activityMgr.restartPackage(context.getPackageName());
|
* activityMgr.restartPackage(context.getPackageName());
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package com.kejiang.yuandl.view;
|
package com.kejiang.yuandl.view;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.drawable.ColorDrawable;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
@@ -52,9 +54,18 @@ public class MyGallery extends Gallery implements OnItemSelectedListener {
|
|||||||
private final Timer timer = new Timer();
|
private final Timer timer = new Timer();
|
||||||
private final TimerTask task = new TimerTask() {
|
private final TimerTask task = new TimerTask() {
|
||||||
public void run() {
|
public void run() {
|
||||||
mHandler.sendEmptyMessage(timerAnimation);
|
if (autoPlay) {
|
||||||
|
mHandler.sendEmptyMessage(timerAnimation);
|
||||||
|
} else {
|
||||||
|
timer.cancel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
private boolean autoPlay = true;
|
||||||
|
|
||||||
|
public void setAutoPlay(boolean autoPlay) {
|
||||||
|
this.autoPlay = autoPlay;
|
||||||
|
}
|
||||||
|
|
||||||
public MyGallery(Context paramContext) {
|
public MyGallery(Context paramContext) {
|
||||||
super(paramContext);
|
super(paramContext);
|
||||||
@@ -98,6 +109,7 @@ public class MyGallery extends Gallery implements OnItemSelectedListener {
|
|||||||
|
|
||||||
private int count = 0;
|
private int count = 0;
|
||||||
private LinearLayout ll_focus_indicator_container;
|
private LinearLayout ll_focus_indicator_container;
|
||||||
|
|
||||||
public void init(int count, LinearLayout ll_focus_indicator_container) {
|
public void init(int count, LinearLayout ll_focus_indicator_container) {
|
||||||
this.count = count;
|
this.count = count;
|
||||||
this.ll_focus_indicator_container = ll_focus_indicator_container;
|
this.ll_focus_indicator_container = ll_focus_indicator_container;
|
||||||
@@ -107,7 +119,7 @@ public class MyGallery extends Gallery implements OnItemSelectedListener {
|
|||||||
|
|
||||||
private void InitFocusIndicatorContainer() {
|
private void InitFocusIndicatorContainer() {
|
||||||
ll_focus_indicator_container.removeAllViews();
|
ll_focus_indicator_container.removeAllViews();
|
||||||
if(count<=1){
|
if (count <= 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
@@ -116,10 +128,11 @@ public class MyGallery extends Gallery implements OnItemSelectedListener {
|
|||||||
ImageView.ScaleType localScaleType = ImageView.ScaleType.FIT_XY;
|
ImageView.ScaleType localScaleType = ImageView.ScaleType.FIT_XY;
|
||||||
localImageView.setScaleType(localScaleType);
|
localImageView.setScaleType(localScaleType);
|
||||||
LinearLayout.LayoutParams localLayoutParams = new LinearLayout.LayoutParams(
|
LinearLayout.LayoutParams localLayoutParams = new LinearLayout.LayoutParams(
|
||||||
24, 24);
|
155, 11);
|
||||||
|
localLayoutParams.weight = 1;
|
||||||
localImageView.setLayoutParams(localLayoutParams);
|
localImageView.setLayoutParams(localLayoutParams);
|
||||||
localImageView.setPadding(5, 5, 5, 5);
|
localImageView.setPadding(0, 0, 0, 0);
|
||||||
localImageView.setImageResource(R.drawable.indicator_normal);
|
localImageView.setImageDrawable(new ColorDrawable(Color.TRANSPARENT));
|
||||||
ll_focus_indicator_container.addView(localImageView);
|
ll_focus_indicator_container.addView(localImageView);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -132,25 +145,24 @@ public class MyGallery extends Gallery implements OnItemSelectedListener {
|
|||||||
@Override
|
@Override
|
||||||
public void onItemSelected(AdapterView<?> adapterView, View view, int selIndex, long l) {
|
public void onItemSelected(AdapterView<?> adapterView, View view, int selIndex, long l) {
|
||||||
//修改上一次选中项的背景
|
//修改上一次选中项的背景
|
||||||
if(count==0){
|
if (count == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
selIndex = selIndex %count;
|
selIndex = selIndex % count;
|
||||||
|
|
||||||
ImageView preSelImg = (ImageView) ll_focus_indicator_container
|
ImageView preSelImg = (ImageView) ll_focus_indicator_container
|
||||||
.findViewById(preSelImgIndex);
|
.findViewById(preSelImgIndex);
|
||||||
if(preSelImg==null){
|
if (preSelImg == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
preSelImg.setImageDrawable(getContext()
|
preSelImg.setImageDrawable(new ColorDrawable(Color.TRANSPARENT));
|
||||||
.getResources().getDrawable(R.drawable.indicator_normal));
|
|
||||||
//修改当前选中项的背景
|
//修改当前选中项的背景
|
||||||
ImageView curSelImg = (ImageView) ll_focus_indicator_container
|
ImageView curSelImg = (ImageView) ll_focus_indicator_container
|
||||||
.findViewById(selIndex);
|
.findViewById(selIndex);
|
||||||
curSelImg
|
curSelImg
|
||||||
.setImageDrawable(getContext()
|
.setImageDrawable(getContext()
|
||||||
.getResources().getDrawable(
|
.getResources().getDrawable(
|
||||||
R.drawable.indicator_focus));
|
R.drawable.dots_focus));
|
||||||
preSelImgIndex = selIndex;
|
preSelImgIndex = selIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package com.kejiang.yuandl.view;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.widget.GridView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* File_name com.dy.logs.mp.ui.MyGridView
|
||||||
|
* @author linglongxin24 <br/>
|
||||||
|
* @date create at 2014-6-6下午2:07:04 <br/>
|
||||||
|
* @time update at 2014-6-6下午2:07:04
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义gridview,解决ListView中嵌套gridview显示不正常的问题(1行半)
|
||||||
|
*
|
||||||
|
* @author wangyx
|
||||||
|
* @version 1.0.0 2012-9-14
|
||||||
|
*/
|
||||||
|
public class MyGridView extends GridView {
|
||||||
|
public MyGridView(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MyGridView(Context context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MyGridView(Context context, AttributeSet attrs, int defStyle) {
|
||||||
|
super(context, attrs, defStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
|
|
||||||
|
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
|
||||||
|
MeasureSpec.AT_MOST);
|
||||||
|
super.onMeasure(widthMeasureSpec, expandSpec);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.kejiang.yuandl.view;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.widget.ListView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* File_name com.dy.logs.mp.ui.MyListView
|
||||||
|
*
|
||||||
|
* @author linglongxin24 <br/>
|
||||||
|
* @date create at 2014-6-6<><36><EFBFBD><EFBFBD>2:09:42 <br/>
|
||||||
|
* @time update at 2014-6-6<><36><EFBFBD><EFBFBD>2:09:42
|
||||||
|
*/
|
||||||
|
public class MyListView extends ListView {
|
||||||
|
|
||||||
|
public MyListView(Context context) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MyListView(Context context, AttributeSet attrs) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
super(context, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MyListView(Context context, AttributeSet attrs, int defStyle) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
super(context, attrs, defStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
|
||||||
|
MeasureSpec.AT_MOST);
|
||||||
|
super.onMeasure(widthMeasureSpec, expandSpec);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,226 @@
|
|||||||
|
package com.kejiang.yuandl.view;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
|
|
||||||
|
import com.kejiang.yuandl.R;
|
||||||
|
import com.orhanobut.logger.Logger;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by hedge_hog on 2015/6/11.
|
||||||
|
* <p/>
|
||||||
|
* add halfstar show
|
||||||
|
* <p/>
|
||||||
|
* Correction clickEvent from Xml
|
||||||
|
*/
|
||||||
|
public class RatingBar extends LinearLayout {
|
||||||
|
private boolean mClickable;
|
||||||
|
private int starCount;
|
||||||
|
private OnRatingChangeListener onRatingChangeListener;
|
||||||
|
private float starImageSize;
|
||||||
|
private float starStep;
|
||||||
|
private Drawable starEmptyDrawable;
|
||||||
|
private Drawable starFillDrawable;
|
||||||
|
private Drawable starHalfDrawable;
|
||||||
|
|
||||||
|
public void setStarHalfDrawable(Drawable starHalfDrawable) {
|
||||||
|
this.starHalfDrawable = starHalfDrawable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setOnRatingChangeListener(OnRatingChangeListener onRatingChangeListener) {
|
||||||
|
this.onRatingChangeListener = onRatingChangeListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setmClickable(boolean clickable) {
|
||||||
|
this.mClickable = clickable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStarFillDrawable(Drawable starFillDrawable) {
|
||||||
|
this.starFillDrawable = starFillDrawable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStarEmptyDrawable(Drawable starEmptyDrawable) {
|
||||||
|
this.starEmptyDrawable = starEmptyDrawable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStarImageSize(float starImageSize) {
|
||||||
|
this.starImageSize = starImageSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param context
|
||||||
|
* @param attrs
|
||||||
|
*/
|
||||||
|
public RatingBar(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
setOrientation(LinearLayout.HORIZONTAL);
|
||||||
|
TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.RatingBar);
|
||||||
|
starImageSize = mTypedArray.getDimension(R.styleable.RatingBar_starImageSize, 20);
|
||||||
|
starStep = mTypedArray.getFloat(R.styleable.RatingBar_starStep, 1.0f);
|
||||||
|
starCount = mTypedArray.getInteger(R.styleable.RatingBar_starCount, 5);
|
||||||
|
starEmptyDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starEmpty);
|
||||||
|
starFillDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starFill);
|
||||||
|
starHalfDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starHalf);
|
||||||
|
mClickable = mTypedArray.getBoolean(R.styleable.RatingBar_clickable, true);
|
||||||
|
for (int i = 0; i < starCount; ++i) {
|
||||||
|
final ImageView imageView = getStarImageView(context, attrs);
|
||||||
|
imageView.setImageDrawable(starEmptyDrawable);
|
||||||
|
imageView.setOnClickListener(
|
||||||
|
new OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if (mClickable) {
|
||||||
|
|
||||||
|
//浮点数的整数部分
|
||||||
|
int fint = (int) starStep;
|
||||||
|
BigDecimal b1 = new BigDecimal(Float.toString(starStep));
|
||||||
|
BigDecimal b2 = new BigDecimal(Integer.toString(fint));
|
||||||
|
//浮点数的小数部分
|
||||||
|
float fPoint = b1.subtract(b2).floatValue();
|
||||||
|
if (fPoint == 0) {
|
||||||
|
fint -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (indexOfChild(v) > fint) {
|
||||||
|
setStar(indexOfChild(v) + 0.5f);
|
||||||
|
} else if (indexOfChild(v) == fint) {
|
||||||
|
if (imageView.getDrawable().getCurrent().getConstantState().equals(starHalfDrawable.getConstantState())) {
|
||||||
|
setStar(indexOfChild(v) + 1);
|
||||||
|
} else {
|
||||||
|
setStar(indexOfChild(v) + 0.5f);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setStar(indexOfChild(v) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
addView(imageView);
|
||||||
|
}
|
||||||
|
setStar(starStep);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param context
|
||||||
|
* @param attrs
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private ImageView getStarImageView(Context context, AttributeSet attrs) {
|
||||||
|
ImageView imageView = new ImageView(context);
|
||||||
|
ViewGroup.LayoutParams para = new ViewGroup.LayoutParams(
|
||||||
|
Math.round(starImageSize),
|
||||||
|
Math.round(starImageSize)
|
||||||
|
);
|
||||||
|
imageView.setLayoutParams(para);
|
||||||
|
imageView.setPadding(0, 0, 5, 0);
|
||||||
|
imageView.setImageDrawable(starEmptyDrawable);
|
||||||
|
imageView.setMaxWidth(10);
|
||||||
|
imageView.setMaxHeight(10);
|
||||||
|
return imageView;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* setting start
|
||||||
|
*
|
||||||
|
* @param rating
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void setStar(float rating) {
|
||||||
|
|
||||||
|
if (onRatingChangeListener != null) {
|
||||||
|
onRatingChangeListener.onRatingChange(rating);
|
||||||
|
}
|
||||||
|
this.starStep = rating;
|
||||||
|
//浮点数的整数部分
|
||||||
|
int fint = (int) rating;
|
||||||
|
BigDecimal b1 = new BigDecimal(Float.toString(rating));
|
||||||
|
BigDecimal b2 = new BigDecimal(Integer.toString(fint));
|
||||||
|
//浮点数的小数部分
|
||||||
|
float fPoint = b1.subtract(b2).floatValue();
|
||||||
|
|
||||||
|
//drawfullstar
|
||||||
|
for (int i = 0; i < fint; ++i) {
|
||||||
|
((ImageView) getChildAt(i)).setImageDrawable(starFillDrawable);
|
||||||
|
}
|
||||||
|
for (int i = fint; i < starCount; i++) {
|
||||||
|
((ImageView) getChildAt(i)).setImageDrawable(starEmptyDrawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fPoint > 0) {
|
||||||
|
((ImageView) getChildAt(fint)).setImageDrawable(starHalfDrawable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * setting start
|
||||||
|
// *
|
||||||
|
// * @param starCount
|
||||||
|
// */
|
||||||
|
//
|
||||||
|
// public void setStar(float starCount) {
|
||||||
|
//
|
||||||
|
// //浮点数的整数部分
|
||||||
|
// int fint = (int) starCount;
|
||||||
|
// BigDecimal b1 = new BigDecimal(Float.toString(starCount));
|
||||||
|
// BigDecimal b2 = new BigDecimal(Integer.toString(fint));
|
||||||
|
// //浮点数的小数部分
|
||||||
|
// float fPoint = b1.subtract(b2).floatValue();
|
||||||
|
// Logger.d("fint=" + fint);
|
||||||
|
// Logger.d("fPoint=" + fPoint);
|
||||||
|
//
|
||||||
|
// starCount = fint > this.starCount ? this.starCount : fint;
|
||||||
|
// starCount = starCount < 0 ? 0 : starCount;
|
||||||
|
//
|
||||||
|
// //drawfullstar
|
||||||
|
// for (int i = 0; i < starCount; ++i) {
|
||||||
|
// ((ImageView) getChildAt(i)).setImageDrawable(starFillDrawable);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// //drawhalfstar
|
||||||
|
// if (fPoint > 0) {
|
||||||
|
// ((ImageView) getChildAt(fint)).setImageDrawable(starHalfDrawable);
|
||||||
|
//
|
||||||
|
// //drawemptystar
|
||||||
|
// for (int i = this.starCount - 1; i >= starCount + 1; --i) {
|
||||||
|
// ((ImageView) getChildAt(i)).setImageDrawable(starEmptyDrawable);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// } else {
|
||||||
|
// //drawemptystar
|
||||||
|
// for (int i = this.starCount - 1; i >= starCount; --i) {
|
||||||
|
// ((ImageView) getChildAt(i)).setImageDrawable(starEmptyDrawable);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
|
||||||
|
/**
|
||||||
|
* change stat listener
|
||||||
|
*/
|
||||||
|
public interface OnRatingChangeListener {
|
||||||
|
|
||||||
|
void onRatingChange(float RatingCount);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package com.kejiang.yuandl.view.snapscrollview;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
public class McoyProductContentPage implements McoySnapPageLayout.McoySnapPage {
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
|
||||||
|
private View rootView = null;
|
||||||
|
|
||||||
|
public McoyProductContentPage(Context context,View rootView) {
|
||||||
|
this.context = context;
|
||||||
|
this.rootView = rootView;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getRootView() {
|
||||||
|
return rootView;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAtTop() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAtBottom() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package com.kejiang.yuandl.view.snapscrollview;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
|
||||||
|
public class McoyProductDetailInfoPage implements McoySnapPageLayout.McoySnapPage{
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
|
||||||
|
private View rootView = null;
|
||||||
|
private McoyScrollView mcoyScrollView = null;
|
||||||
|
|
||||||
|
public McoyProductDetailInfoPage (Context context, View rootView,McoyScrollView mcoyScrollView) {
|
||||||
|
this.context = context;
|
||||||
|
this.rootView = rootView;
|
||||||
|
this.mcoyScrollView = mcoyScrollView;
|
||||||
|
// mcoyScrollView = (McoyScrollView) this.rootView
|
||||||
|
// .findViewById(R.id.product_scrollview);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getRootView() {
|
||||||
|
return rootView;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAtTop() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAtBottom() {
|
||||||
|
int scrollY = mcoyScrollView.getScrollY();
|
||||||
|
int height = mcoyScrollView.getHeight();
|
||||||
|
int scrollViewMeasuredHeight = mcoyScrollView.getChildAt(0).getMeasuredHeight();
|
||||||
|
|
||||||
|
if ((scrollY + height) >= scrollViewMeasuredHeight) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
package com.kejiang.yuandl.view.snapscrollview;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.widget.ScrollView;
|
||||||
|
|
||||||
|
public class McoyScrollView extends ScrollView {
|
||||||
|
// 滑动距离及坐标
|
||||||
|
private float xDistance, yDistance, xLast, yLast;
|
||||||
|
|
||||||
|
public McoyScrollView(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
||||||
|
Log.e("mcoy", "McoyScrollView--onInterceptTouchEvent");
|
||||||
|
switch (ev.getAction()) {
|
||||||
|
case MotionEvent.ACTION_DOWN:
|
||||||
|
xDistance = yDistance = 0f;
|
||||||
|
xLast = ev.getX();
|
||||||
|
yLast = ev.getY();
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_MOVE:
|
||||||
|
final float curX = ev.getX();
|
||||||
|
final float curY = ev.getY();
|
||||||
|
|
||||||
|
xDistance += Math.abs(curX - xLast);
|
||||||
|
yDistance += Math.abs(curY - yLast);
|
||||||
|
xLast = curX;
|
||||||
|
yLast = curY;
|
||||||
|
|
||||||
|
if (xDistance > yDistance) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boolean onIntercept = super.onInterceptTouchEvent(ev);
|
||||||
|
Log.e("mcoy", "McoyScrollView--onInterceptTouchEvent return " + onIntercept);
|
||||||
|
|
||||||
|
return onIntercept;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(MotionEvent ev) {
|
||||||
|
boolean touchEvent = super.onTouchEvent(ev);
|
||||||
|
Log.e("mcoy", "McoyScrollView--onTouchEvent return " + touchEvent);
|
||||||
|
return touchEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
|
||||||
|
super.onScrollChanged(x, y, oldx, oldy);
|
||||||
|
if (onScrollListener != null) {
|
||||||
|
onScrollListener.onScroll(x, y, oldx, oldy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private OnJDScrollListener onScrollListener;
|
||||||
|
|
||||||
|
public OnJDScrollListener getOnScrollListener() {
|
||||||
|
return onScrollListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnJDScrollListener(OnJDScrollListener onScrollListener) {
|
||||||
|
this.onScrollListener = onScrollListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OnJDScrollListener {
|
||||||
|
void onScroll(int x, int y, int oldx, int oldy);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,452 @@
|
|||||||
|
package com.kejiang.yuandl.view.snapscrollview;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.view.VelocityTracker;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewConfiguration;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Scroller;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author jiangxinxing---mcoy in English
|
||||||
|
*
|
||||||
|
* 了解此ViewGroup之前, 有两点一定要做到心中有数
|
||||||
|
* 一个是对Scroller的使用, 另一个是对onInterceptTouchEvent和onTouchEvent要做到很熟悉
|
||||||
|
* 以下几个网站可以做参考用
|
||||||
|
* http://blog.csdn.net/bigconvience/article/details/26697645
|
||||||
|
* http://blog.csdn.net/androiddevelop/article/details/8373782
|
||||||
|
* http://blog.csdn.net/xujainxing/article/details/8985063
|
||||||
|
*/
|
||||||
|
public class McoySnapPageLayout extends ViewGroup {
|
||||||
|
private final String TAG = "McoySnapPageLayout";
|
||||||
|
private final boolean MCOY_DEBUG = true;
|
||||||
|
|
||||||
|
private VelocityTracker mVelocityTracker;
|
||||||
|
private int mMaximumVelocity;
|
||||||
|
private static final int SNAP_VELOCITY = 1000;
|
||||||
|
|
||||||
|
public static final int FLIP_DIRECTION_CUR = 0;
|
||||||
|
public static final int FLIP_DIRECTION_UP = -1;
|
||||||
|
public static final int FLIP_DIRECTION_DOWN = 1;
|
||||||
|
|
||||||
|
private int mFlipDrection = FLIP_DIRECTION_CUR;
|
||||||
|
|
||||||
|
private int mDataIndex = 0; // 当前View中的数据在总数据所在位置
|
||||||
|
private int mCurrentScreen = 0;
|
||||||
|
private int mNextDataIndex = 0;
|
||||||
|
|
||||||
|
private float mLastMotionY;
|
||||||
|
// 记录触摸状态
|
||||||
|
private final static int TOUCH_STATE_REST = 0;
|
||||||
|
private final static int TOUCH_STATE_SCROLLING = 1;
|
||||||
|
private int mTouchState = TOUCH_STATE_REST;
|
||||||
|
|
||||||
|
private Scroller mScroller; //mcoy add view滑动的矢量, 并没有真正滑动的功能
|
||||||
|
|
||||||
|
private McoySnapPage mPageTop, mPageBottom;
|
||||||
|
|
||||||
|
private PageSnapedListener mPageSnapedListener;
|
||||||
|
|
||||||
|
//这个值表示需要第一页和第二页之间的鸿沟
|
||||||
|
private int gapBetweenTopAndBottom;
|
||||||
|
|
||||||
|
public interface McoySnapPage {
|
||||||
|
/**
|
||||||
|
* 返回page根节点
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
View getRootView();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否滑动到最顶端
|
||||||
|
* 第二页必须自己实现此方法,来判断是否已经滑动到第二页的顶部
|
||||||
|
* 并决定是否要继续滑动到第一页
|
||||||
|
*/
|
||||||
|
boolean isAtTop();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否滑动到最底部
|
||||||
|
* 第一页必须自己实现此方法,来判断是否已经滑动到第二页的底部
|
||||||
|
* 并决定是否要继续滑动到第二页
|
||||||
|
*/
|
||||||
|
boolean isAtBottom();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface PageSnapedListener {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @mcoy
|
||||||
|
* 当从某一页滑动到另一页完成时的回调函数
|
||||||
|
*/
|
||||||
|
void onSnapedCompleted(int derection);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPageSnapListener(PageSnapedListener listener){
|
||||||
|
mPageSnapedListener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public McoySnapPageLayout(Context context, AttributeSet att) {
|
||||||
|
this(context, att, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public McoySnapPageLayout(Context context, AttributeSet attrs, int defStyle) {
|
||||||
|
super(context, attrs, defStyle);
|
||||||
|
initViews();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initViews() {
|
||||||
|
mScroller = new Scroller(getContext());
|
||||||
|
|
||||||
|
gapBetweenTopAndBottom = ViewConfiguration.get(getContext()).getScaledTouchSlop();
|
||||||
|
mMaximumVelocity = ViewConfiguration.get(getContext()).getScaledMaximumFlingVelocity();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
|
|
||||||
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||||
|
|
||||||
|
// The children are given the same width and height as the workspace
|
||||||
|
final int count = getChildCount();
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
try {
|
||||||
|
getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
|
||||||
|
int childTop = 0;
|
||||||
|
int count = getChildCount();
|
||||||
|
// DLog.i(TAG, "onLayout mDataIndex = " + mDataIndex);
|
||||||
|
// 设置布局,将子视图顺序竖屏排列
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
final View child = getChildAt(i);
|
||||||
|
if (child.getVisibility() != View.GONE) {
|
||||||
|
final int childWidth = child.getMeasuredWidth();
|
||||||
|
final int childHeight = child.getMeasuredHeight();
|
||||||
|
childTop = childHeight * i;
|
||||||
|
child.layout(0, childTop, childWidth,
|
||||||
|
childTop + childHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(count > 0){
|
||||||
|
snapToScreen(mDataIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置上下页面
|
||||||
|
* @param pageTop
|
||||||
|
* @param pageBottom
|
||||||
|
*/
|
||||||
|
public void setSnapPages(McoySnapPage pageTop, McoySnapPage pageBottom) {
|
||||||
|
mPageTop = pageTop;
|
||||||
|
mPageBottom = pageBottom;
|
||||||
|
addPagesAndRefresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addPagesAndRefresh() {
|
||||||
|
// 设置页面id
|
||||||
|
mPageTop.getRootView().setId(0);
|
||||||
|
mPageBottom.getRootView().setId(1);
|
||||||
|
addView(mPageTop.getRootView());
|
||||||
|
addView(mPageBottom.getRootView());
|
||||||
|
postInvalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @mcoy add
|
||||||
|
* computeScroll方法会调用postInvalidate()方法, 而postInvalidate()方法中系统
|
||||||
|
* 又会调用computeScroll方法, 因此会一直在循环互相调用, 循环的终结点是在computeScrollOffset()
|
||||||
|
* 当computeScrollOffset这个方法返回false时,说明已经结束滚动。
|
||||||
|
*
|
||||||
|
* 重要:真正的实现此view的滚动是调用scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void computeScroll() {
|
||||||
|
//先判断mScroller滚动是否完成
|
||||||
|
if (mScroller.computeScrollOffset()) {
|
||||||
|
if (mScroller.getCurrY() == (mScroller.getFinalY())) {
|
||||||
|
if (mNextDataIndex > mDataIndex) {
|
||||||
|
mFlipDrection = FLIP_DIRECTION_DOWN;
|
||||||
|
makePageToNext(mNextDataIndex);
|
||||||
|
} else if (mNextDataIndex < mDataIndex) {
|
||||||
|
mFlipDrection = FLIP_DIRECTION_UP;
|
||||||
|
makePageToPrev(mNextDataIndex);
|
||||||
|
}else{
|
||||||
|
mFlipDrection = FLIP_DIRECTION_CUR;
|
||||||
|
}
|
||||||
|
if(mPageSnapedListener != null){
|
||||||
|
mPageSnapedListener.onSnapedCompleted(mFlipDrection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//这里调用View的scrollTo()完成实际的滚动
|
||||||
|
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
|
||||||
|
//必须调用该方法,否则不一定能看到滚动效果
|
||||||
|
postInvalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void makePageToNext(int dataIndex) {
|
||||||
|
mDataIndex = dataIndex;
|
||||||
|
mCurrentScreen = getCurrentScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void makePageToPrev(int dataIndex) {
|
||||||
|
mDataIndex = dataIndex;
|
||||||
|
mCurrentScreen = getCurrentScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCurrentScreen() {
|
||||||
|
for (int i = 0; i < getChildCount(); i++) {
|
||||||
|
if (getChildAt(i).getId() == mDataIndex) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mCurrentScreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
public View getCurrentView() {
|
||||||
|
for (int i = 0; i < getChildCount(); i++) {
|
||||||
|
if (getChildAt(i).getId() == mDataIndex) {
|
||||||
|
return getChildAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* android.view.ViewGroup#onInterceptTouchEvent(android.view.MotionEvent)
|
||||||
|
* 重写了父类的onInterceptTouchEvent(),主要功能是在onTouchEvent()方法之前处理
|
||||||
|
* touch事件。包括:down、up、move事件。
|
||||||
|
* 当onInterceptTouchEvent()返回true时进入onTouchEvent()。
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
||||||
|
final int action = ev.getAction();
|
||||||
|
if ((action == MotionEvent.ACTION_MOVE)
|
||||||
|
&& (mTouchState != TOUCH_STATE_REST)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
final float x = ev.getX();
|
||||||
|
final float y = ev.getY();
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case MotionEvent.ACTION_MOVE:
|
||||||
|
// 记录y与mLastMotionY差值的绝对值。
|
||||||
|
// yDiff大于gapBetweenTopAndBottom时就认为界面拖动了足够大的距离,屏幕就可以移动了。
|
||||||
|
final int yDiff = (int)(y - mLastMotionY);
|
||||||
|
boolean yMoved = Math.abs(yDiff) > gapBetweenTopAndBottom;
|
||||||
|
if (yMoved) {
|
||||||
|
if(MCOY_DEBUG) {
|
||||||
|
Log.e(TAG, "yDiff is " + yDiff);
|
||||||
|
Log.e(TAG, "mPageTop.isFlipToBottom() is " + mPageTop.isAtBottom());
|
||||||
|
Log.e(TAG, "mCurrentScreen is " + mCurrentScreen);
|
||||||
|
Log.e(TAG, "mPageBottom.isFlipToTop() is " + mPageBottom.isAtTop());
|
||||||
|
}
|
||||||
|
if(yDiff < 0 && mPageTop.isAtBottom() && mCurrentScreen == 0
|
||||||
|
|| yDiff > 0 && mPageBottom.isAtTop() && mCurrentScreen == 1){
|
||||||
|
Log.e("mcoy", "121212121212121212121212");
|
||||||
|
mTouchState = TOUCH_STATE_SCROLLING;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_DOWN:
|
||||||
|
// Remember location of down touch
|
||||||
|
mLastMotionY = y;
|
||||||
|
Log.e("mcoy", "mScroller.isFinished() is " + mScroller.isFinished());
|
||||||
|
mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST
|
||||||
|
: TOUCH_STATE_SCROLLING;
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_CANCEL:
|
||||||
|
case MotionEvent.ACTION_UP:
|
||||||
|
// Release the drag
|
||||||
|
mTouchState = TOUCH_STATE_REST;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
boolean intercept = mTouchState != TOUCH_STATE_REST;
|
||||||
|
Log.e("mcoy", "McoySnapPageLayout---onInterceptTouchEvent return " + intercept);
|
||||||
|
return intercept;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see android.view.View#onTouchEvent(android.view.MotionEvent)
|
||||||
|
* 主要功能是处理onInterceptTouchEvent()返回值为true时传递过来的touch事件
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(MotionEvent ev) {
|
||||||
|
Log.e("mcoy", "onTouchEvent--" + System.currentTimeMillis());
|
||||||
|
if (mVelocityTracker == null) {
|
||||||
|
mVelocityTracker = VelocityTracker.obtain();
|
||||||
|
}
|
||||||
|
mVelocityTracker.addMovement(ev);
|
||||||
|
|
||||||
|
final int action = ev.getAction();
|
||||||
|
final float x = ev.getX();
|
||||||
|
final float y = ev.getY();
|
||||||
|
switch (action) {
|
||||||
|
case MotionEvent.ACTION_DOWN:
|
||||||
|
if (!mScroller.isFinished()) {
|
||||||
|
mScroller.abortAnimation();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_MOVE:
|
||||||
|
if(mTouchState != TOUCH_STATE_SCROLLING){
|
||||||
|
// 记录y与mLastMotionY差值的绝对值。
|
||||||
|
// yDiff大于gapBetweenTopAndBottom时就认为界面拖动了足够大的距离,屏幕就可以移动了。
|
||||||
|
final int yDiff = (int) Math.abs(y - mLastMotionY);
|
||||||
|
boolean yMoved = yDiff > gapBetweenTopAndBottom;
|
||||||
|
if (yMoved) {
|
||||||
|
mTouchState = TOUCH_STATE_SCROLLING;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 手指拖动屏幕的处理
|
||||||
|
if ((mTouchState == TOUCH_STATE_SCROLLING)) {
|
||||||
|
// Scroll to follow the motion event
|
||||||
|
final int deltaY = (int) (mLastMotionY - y);
|
||||||
|
mLastMotionY = y;
|
||||||
|
final int scrollY = getScrollY();
|
||||||
|
if(mCurrentScreen == 0){//显示第一页,只能上拉时使用
|
||||||
|
if(mPageTop != null && mPageTop.isAtBottom()){
|
||||||
|
scrollBy(0, Math.max(-1 * scrollY, deltaY));
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if(mPageBottom != null && mPageBottom.isAtTop()){
|
||||||
|
scrollBy(0, deltaY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_CANCEL:
|
||||||
|
case MotionEvent.ACTION_UP:
|
||||||
|
// 弹起手指后,切换屏幕的处理
|
||||||
|
if (mTouchState == TOUCH_STATE_SCROLLING) {
|
||||||
|
final VelocityTracker velocityTracker = mVelocityTracker;
|
||||||
|
velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
|
||||||
|
int velocityY = (int) velocityTracker.getYVelocity();
|
||||||
|
if (Math.abs(velocityY) > SNAP_VELOCITY) {
|
||||||
|
if( velocityY > 0 && mCurrentScreen == 1 && mPageBottom.isAtTop()){
|
||||||
|
snapToScreen(mDataIndex-1);
|
||||||
|
}else if(velocityY < 0 && mCurrentScreen == 0){
|
||||||
|
snapToScreen(mDataIndex+1);
|
||||||
|
}else{
|
||||||
|
snapToScreen(mDataIndex);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
snapToDestination();
|
||||||
|
}
|
||||||
|
if (mVelocityTracker != null) {
|
||||||
|
mVelocityTracker.recycle();
|
||||||
|
mVelocityTracker = null;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
}
|
||||||
|
mTouchState = TOUCH_STATE_REST;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clearOnTouchEvents(){
|
||||||
|
mTouchState = TOUCH_STATE_REST;
|
||||||
|
if (mVelocityTracker != null) {
|
||||||
|
mVelocityTracker.recycle();
|
||||||
|
mVelocityTracker = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void snapToDestination() {
|
||||||
|
// 计算应该去哪个屏
|
||||||
|
final int flipHeight = getHeight() / 8;
|
||||||
|
|
||||||
|
int whichScreen = -1;
|
||||||
|
final int topEdge = getCurrentView().getTop();
|
||||||
|
|
||||||
|
if(topEdge < getScrollY() && (getScrollY()-topEdge) >= flipHeight && mCurrentScreen == 0){
|
||||||
|
//向下滑动
|
||||||
|
whichScreen = mDataIndex + 1;
|
||||||
|
}else if(topEdge > getScrollY() && (topEdge - getScrollY()) >= flipHeight && mCurrentScreen == 1){
|
||||||
|
//向上滑动
|
||||||
|
whichScreen = mDataIndex - 1;
|
||||||
|
}else{
|
||||||
|
whichScreen = mDataIndex;
|
||||||
|
}
|
||||||
|
Log.e(TAG, "snapToDestination mDataIndex = " + mDataIndex);
|
||||||
|
Log.e(TAG, "snapToDestination whichScreen = " + whichScreen);
|
||||||
|
snapToScreen(whichScreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void snapToScreen(int dataIndex) {
|
||||||
|
if (!mScroller.isFinished())
|
||||||
|
return;
|
||||||
|
|
||||||
|
final int direction = dataIndex - mDataIndex;
|
||||||
|
mNextDataIndex = dataIndex;
|
||||||
|
boolean changingScreens = dataIndex != mDataIndex;
|
||||||
|
View focusedChild = getFocusedChild();
|
||||||
|
if (focusedChild != null && changingScreens) {
|
||||||
|
focusedChild.clearFocus();
|
||||||
|
}
|
||||||
|
//在这里判断是否已到目标位置~
|
||||||
|
int newY = 0;
|
||||||
|
switch (direction) {
|
||||||
|
case 1: //需要滑动到第二页
|
||||||
|
Log.e(TAG, "the direction is 1");
|
||||||
|
newY = getCurrentView().getBottom(); // 最终停留的位置
|
||||||
|
break;
|
||||||
|
case -1: //需要滑动到第一页
|
||||||
|
Log.e(TAG, "the direction is -1");
|
||||||
|
Log.e(TAG, "getCurrentView().getTop() is "
|
||||||
|
+ getCurrentView().getTop() + " getHeight() is "
|
||||||
|
+ getHeight());
|
||||||
|
newY = getCurrentView().getTop() - getHeight(); // 最终停留的位置
|
||||||
|
break;
|
||||||
|
case 0: //滑动距离不够, 因此不造成换页,回到滑动之前的位置
|
||||||
|
Log.e(TAG, "the direction is 0");
|
||||||
|
newY = getCurrentView().getTop(); //第一页的top是0, 第二页的top应该是第一页的高度
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
final int cy = getScrollY(); // 启动的位置
|
||||||
|
Log.e(TAG, "the newY is " + newY + " cy is " + cy);
|
||||||
|
final int delta = newY - cy; // 滑动的距离,正值是往左滑<—,负值是往右滑—>
|
||||||
|
mScroller.startScroll(0, cy, 0, delta, Math.abs(delta));
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void snapToPrev(){
|
||||||
|
if(mCurrentScreen == 1){
|
||||||
|
snapToScreen(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void snapToNext(){
|
||||||
|
if(mCurrentScreen == 0){
|
||||||
|
snapToScreen(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void snapToCurrent(){
|
||||||
|
snapToScreen(mCurrentScreen);
|
||||||
|
clearOnTouchEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
BIN
libray_lxndroid/src/main/res/drawable/arrow_back_red.png
Normal file
BIN
libray_lxndroid/src/main/res/drawable/arrow_back_red.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
BIN
libray_lxndroid/src/main/res/drawable/dots_focus.png
Normal file
BIN
libray_lxndroid/src/main/res/drawable/dots_focus.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
libray_lxndroid/src/main/res/drawable/dots_normal.png
Normal file
BIN
libray_lxndroid/src/main/res/drawable/dots_normal.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
@@ -12,6 +12,7 @@
|
|||||||
<include layout="@layout/public_titlebar" />
|
<include layout="@layout/public_titlebar" />
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
|
android:background="#eeeeee"
|
||||||
android:id="@+id/layout_content"
|
android:id="@+id/layout_content"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
|||||||
@@ -1,61 +1,54 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:id="@+id/layout_titlebar"
|
android:id="@+id/layout_titlebar"
|
||||||
android:orientation="horizontal"
|
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="152px"
|
android:layout_height="160px"
|
||||||
android:background="#af895b">
|
android:background="#FFFFFF"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/button_backward"
|
android:id="@+id/button_backward"
|
||||||
android:layout_width="100px"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="72px"
|
android:layout_height="match_parent"
|
||||||
android:drawablePadding="6px"
|
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:ellipsize="end"
|
android:paddingLeft="33px"
|
||||||
android:layout_marginLeft="20px"
|
android:paddingRight="33px"
|
||||||
android:src="@drawable/arrow_back"
|
android:paddingTop="48px"
|
||||||
|
android:paddingBottom="48px"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:onClick="onBackward"
|
android:onClick="onBackward"
|
||||||
android:paddingLeft="10px"
|
android:src="@drawable/arrow_back_red"
|
||||||
android:paddingRight="10px"
|
|
||||||
android:scaleType="centerCrop"
|
|
||||||
android:singleLine="true"
|
|
||||||
android:textColor="#ffffffff"
|
|
||||||
android:textSize="52px"
|
|
||||||
android:visibility="visible" />
|
android:visibility="visible" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/text_title"
|
android:id="@+id/text_title"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="1"
|
||||||
android:ellipsize="marquee"
|
android:ellipsize="marquee"
|
||||||
android:gravity="center_horizontal|center"
|
android:gravity="center_horizontal|center"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:text="标题栏"
|
android:text="标题栏"
|
||||||
android:layout_weight="1"
|
android:textColor="#000000"
|
||||||
android:textColor="#ffffffff"
|
android:textSize="58px" />
|
||||||
android:textSize="62px" />
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/button_forward"
|
android:id="@+id/button_forward"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
android:paddingLeft="10px"
|
|
||||||
android:paddingRight="40px"
|
|
||||||
android:drawablePadding="6px"
|
|
||||||
android:ellipsize="end"
|
android:ellipsize="end"
|
||||||
android:layout_gravity="center"
|
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:onClick="onForward"
|
android:onClick="onForward"
|
||||||
android:minEms="3"
|
android:paddingLeft="30px"
|
||||||
|
android:paddingRight="33px"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:maxEms="4"
|
android:minWidth="100px"
|
||||||
|
|
||||||
android:text="提交"
|
android:text="提交"
|
||||||
android:textColor="#ffffffff"
|
android:textColor="#000000"
|
||||||
android:textSize="48px"
|
android:textSize="50px"
|
||||||
android:visibility="invisible" />
|
android:visibility="invisible" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
Reference in New Issue
Block a user