登录弹出对话框
public class AutoLoginDialog extends Dialog {
public AutoLoginDialog(Context context) {
super(context);
}
public AutoLoginDialog(Context context, int theme) {
super(context, theme);
}
public static class Builder {
private SSOController ssoController;
private Context context;
private String title;
private String message;
private String positiveButtonText;
private String negativeButtonText;
private View contentView;
private AutoLoginDialog dialog;
private android.view.View.OnClickListener positiveButtonClickListener;
private android.view.View.OnClickListener negativeButtonClickListener;
public Builder(Context context,AutoLoginDialog dialog) {
this.context = context;
this.dialog = dialog;
ssoController = new SSOController();
}
public Builder setMessage(String message) {
this.message = message;
return this;
}
/**
* Set the Dialog message from resource
*
* @param title
* @return
*/
public Builder setMessage(int message) {
this.message = (String) context.getText(message);
return this;
}
/**
* Set the Dialog title from resource
*
* @param title
* @return
*/
public Builder setTitle(int title) {
this.title = (String) context.getText(title);
return this;
}
/**
* Set the Dialog title from String
*
* @param title
* @return
*/
public Builder setTitle(String title) {
this.title = title;
return this;
}
public Builder setContentView(View v) {
this.contentView = v;
return this;
}
/**
* Set the positive button resource and it's listener
*
* @param positiveButtonText
* @return
*/
public Builder setPositiveButton(int positiveButtonText, android.view.View.OnClickListener listener) {
this.positiveButtonText = (String) context.getText(positiveButtonText);
this.positiveButtonClickListener = listener;
return this;
}
public Builder setPositiveButton(String positiveButtonText, android.view.View.OnClickListener listener) {
this.positiveButtonText = positiveButtonText;
this.positiveButtonClickListener = listener;
return this;
}
public Builder setNegativeButton(int negativeButtonText, android.view.View.OnClickListener listener) {
this.negativeButtonText = (String) context.getText(negativeButtonText);
this.negativeButtonClickListener = listener;
return this;
}
public Builder setNegativeButton(String negativeButtonText, android.view.View.OnClickListener listener) {
this.negativeButtonText = negativeButtonText;
this.negativeButtonClickListener = listener;
return this;
}
public AutoLoginDialog create() {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// instantiate the dialog with the custom Theme
// final CustomDialog dialog = new CustomDialog(context, R.style.Dialog);
// View layout = inflater.inflate(R.layout.alertdialog_edit, null);
View layout = contentView;
dialog.addContentView(layout, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
// set the dialog title
// ((TextView)layout.findViewById(R.id.title)).setText(title);
// ((MyTextView) layout.findViewById(R.id.title)).setText(title);
String phoneNames = ssoController.getCacheUser();
Log.d("yangxf", " title = "+title+" phoneNames= "+phoneNames);
((MyTextView) layout.findViewById(R.id.title)).setSpecifiedTextsColor(title, phoneNames, Color.parseColor("#56c259"));
// set the confirm button
if (positiveButtonText != null) {
// ((Button)
// layout.findViewById(R.id.positiveButton)).setText(positiveButtonText);
((Button) layout.findViewById(R.id.btn_positive)).setText(positiveButtonText);
if (positiveButtonClickListener != null) {
((Button) layout.findViewById(R.id.btn_positive)).setOnClickListener(positiveButtonClickListener);
}
} else {
// if no confirm button just set the visibility to GONE
layout.findViewById(R.id.btn_positive).setVisibility(View.GONE);
}
// set the cancel button
if (negativeButtonText != null) {
// ((Button) layout.findViewById(R.id.negativeButton))
// .setText(negativeButtonText);
Button btn = (Button) layout.findViewById(R.id.btn_negative);
btn.setText(negativeButtonText);
if (negativeButtonClickListener != null) {
((Button) layout.findViewById(R.id.btn_negative)).setOnClickListener(negativeButtonClickListener);
}
} else {
// if no confirm button just set the visibility to GONE
// layout.findViewById(R.id.btn_negative).setVisibility(View.GONE);
}
dialog.setContentView(layout);
return dialog;
}
}
}
Banner控件
public class Banner extends FrameLayout implements ViewPager.OnPageChangeListener {
public static final int NOT_INDICATOR=0;
public static final int CIRCLE_INDICATOR=1;
public static final int NUM_INDICATOR=2;
public static final int NUM_INDICATOR_TITLE=3;
public static final int CIRCLE_INDICATOR_TITLE=4;
public static final int LEFT=5;
public static final int CENTER=6;
public static final int RIGHT=7;
private int mIndicatorMargin = 5;
private int mIndicatorWidth = 8;
private int mIndicatorHeight = 8;
private int mIndicatorSelectedResId = R.drawable.gray_radius;
private int mIndicatorUnselectedResId = R.drawable.white_radius;
private int bannerStyle=CIRCLE_INDICATOR;
private int count;
private int currentItem;
private int delayTime=2000;
private int gravity=-1;
private boolean isAutoPlay=true;
private List<ImageView> imageViews;
private List<ImageView> indicatorImages;
private Context context;
private MyViewPager viewPager;
private LinearLayout indicator;
private Handler handler = new Handler();
private OnBannerClickListener listener;
private OnLoadImageListener imageListener;
private String[] titles;
private TextView bannerTitle , numIndicator;
//获取图片信息
protected ImageLoader imageLoader = ImageLoader.getInstance();
DisplayImageOptions options;
public Banner(Context context) {
this(context, null);
}
public Banner(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public Banner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
imageViews = new ArrayList<ImageView>();
indicatorImages = new ArrayList<ImageView>();
initView(context, attrs);
}
private void handleTypedArray(Context context, AttributeSet attrs) {
if (attrs == null) {
return;
}
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Banner);
//设置圆点的宽和高
mIndicatorWidth =typedArray.getDimensionPixelSize(R.styleable.Banner_indicator_width, 30);
mIndicatorHeight =typedArray.getDimensionPixelSize(R.styleable.Banner_indicator_height, 30);
mIndicatorMargin =typedArray.getDimensionPixelSize(R.styleable.Banner_indicator_margin, 5);
mIndicatorSelectedResId =typedArray.getResourceId(R.styleable.Banner_indicator_drawable_selected,
R.drawable.gray_radius);
mIndicatorUnselectedResId =typedArray.getResourceId(R.styleable.Banner_indicator_drawable_unselected,
R.drawable.white_radius);
typedArray.recycle();
}
private void initView(Context context, AttributeSet attrs) {
imageViews.clear();
View view = LayoutInflater.from(context).inflate(R.layout.banner, this, true);
viewPager = (MyViewPager) view.findViewById(R.id.viewpager);
indicator = (LinearLayout) view.findViewById(R.id.indicator);
bannerTitle = (TextView) view.findViewById(R.id.bannerTitle);
numIndicator = (TextView) view.findViewById(R.id.numIndicator);
handleTypedArray(context, attrs);
}
public void setDelayTime(int delayTime) {
this.delayTime=delayTime;
}
public void setIndicatorGravity(int type) {
switch (type){
case LEFT:
this.gravity=Gravity.LEFT|Gravity.CENTER_VERTICAL;
break;
case CENTER:
this.gravity=Gravity.CENTER;
break;
case RIGHT:
this.gravity=Gravity.RIGHT|Gravity.CENTER_VERTICAL;
break;
}
}
public void setBannerTitle(String[] titles) {
this.titles=titles;
if (bannerStyle==CIRCLE_INDICATOR_TITLE||bannerStyle==NUM_INDICATOR_TITLE) {
if (titles != null && titles.length > 0) {
bannerTitle.setVisibility(View.VISIBLE);
indicator.setGravity(Gravity.LEFT|Gravity.CENTER_VERTICAL);
}else{
numIndicator.setBackgroundResource(R.drawable.black_background);
}
}
}
public void setBannerStyle(int bannerStyle) {
this.bannerStyle=bannerStyle;
switch (bannerStyle){
case CIRCLE_INDICATOR:
indicator.setVisibility(View.VISIBLE);
break;
case NUM_INDICATOR:
numIndicator.setVisibility(View.VISIBLE);
numIndicator.setBackgroundResource(R.drawable.black_background);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0,0,10,10);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
numIndicator.setLayoutParams(layoutParams);
numIndicator.setPadding(5,6,5,6);
break;
case NUM_INDICATOR_TITLE:
numIndicator.setVisibility(View.VISIBLE);
break;
case CIRCLE_INDICATOR_TITLE:
indicator.setVisibility(View.VISIBLE);
break;
}
}
public void setImages(Object[] imagesUrl) {
options = Options.getListOptions();
if (imagesUrl==null||imagesUrl.length<=0)
return;
count = imagesUrl.length;
Log.d("zst", "setImages count = "+count);
createIndicator();
if(imageViews != null){
imageViews.clear();
}
// for (int i = 0; i < imagesUrl.length; i++) {
// ImageView img = new ImageView(context);
// img.setScaleType(ScaleType.CENTER_CROP);
// if (i == 0) {
// imageLoader.displayImage((String) imagesUrl[count-1], img, options);
// } else if (i == count + 1) {
// imageLoader.displayImage((String) imagesUrl[0], img, options);
// } else {
// imageLoader.displayImage((String) imagesUrl[i-1], img, options);
// }
// //下载图片
//
// imageViews.add(img);
// }
for (int i = 0; i <= count + 1; i++) {
ImageView iv = new ImageView(context);
iv.setImageResource(R.drawable.background_comment_03);
iv.setScaleType(ScaleType.CENTER_CROP);
if (i == 0) {
Glide.with(context).load(imagesUrl[count - 1]).into(iv);
} else if (i == count + 1) {
Glide.with(context).load(imagesUrl[0]).into(iv);
} else {
Glide.with(context).load(imagesUrl[i - 1]).into(iv);
}
imageViews.add(iv);
}
setData();
}
public void setImages(Object[] imagesUrl,OnLoadImageListener imageListener) {
if (imagesUrl==null||imagesUrl.length<=0)
return;
count = imagesUrl.length;
createIndicator();
for (int i = 0; i <= count + 1; i++) {
ImageView iv = new ImageView(context);
iv.setScaleType(ScaleType.CENTER_CROP);
Object url=null;
if (i == 0) {
url=imagesUrl[count - 1];
} else if (i == count + 1) {
url=imagesUrl[0];
} else {
url=imagesUrl[i - 1];
}
imageViews.add(iv);
if(imageListener!=null){
imageListener.OnLoadImage(iv,url);
}
}
setData();
}
/**
* 当不为空时,清空所有数据
* 为空时
*/
private void createIndicator() {
if(indicatorImages != null && indicatorImages.size() >0){
indicatorImages.clear();
indicator.removeAllViews();
}
for (int i = 0; i < count; i++) {
ImageView imageView = new ImageView(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mIndicatorWidth,mIndicatorHeight);
params.leftMargin = mIndicatorMargin;
params.rightMargin = mIndicatorMargin;
params.gravity = gravity;
if (i == 0) {
imageView.setBackgroundResource(mIndicatorSelectedResId);
}else{
imageView.setBackgroundResource(mIndicatorUnselectedResId);
}
indicator.addView(imageView, params);
indicatorImages.add(imageView);
}
}
private void setData() {
viewPager.setAdapter(new BannerPagerAdapter());
viewPager.setFocusable(true);
viewPager.setCurrentItem(1);
currentItem = 1;
viewPager.addOnPageChangeListener(this);
if (gravity!=-1)
indicator.setGravity(gravity);
if (isAutoPlay)
startAutoPlay();
}
public void isAutoPlay(boolean isAutoPlay) {
this.isAutoPlay=isAutoPlay;
}
private void startAutoPlay() {
isAutoPlay = true;
handler.postDelayed(task, delayTime);
}
private final Runnable task = new Runnable() {
@Override
public void run() {
if (isAutoPlay) {
currentItem = currentItem % (count + 1) + 1;
if (currentItem == 1) {
viewPager.setCurrentItem(currentItem, false);
handler.post(task);
} else {
viewPager.setCurrentItem(currentItem);
handler.postDelayed(task, delayTime);
}
} else {
handler.postDelayed(task, delayTime);
}
}
};
class BannerPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return imageViews.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public Object instantiateItem(ViewGroup container, final int position) {
container.addView(imageViews.get(position));
final ImageView view=imageViews.get(position);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(listener!=null){
listener.OnBannerClick(v,position);
}
}
});
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(imageViews.get(position));
}
}
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
case 1:
isAutoPlay = false;
break;
case 2:
isAutoPlay = true;
break;
case 0:
if (viewPager.getCurrentItem() == 0) {
viewPager.setCurrentItem(count, false);
} else if (viewPager.getCurrentItem() == count + 1) {
viewPager.setCurrentItem(1, false);
}
currentItem = viewPager.getCurrentItem();
isAutoPlay = true;
break;
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
for (int i = 0; i < indicatorImages.size(); i++) {
if (i == position - 1) {
indicatorImages.get(i).setImageResource(mIndicatorSelectedResId);
} else {
indicatorImages.get(i).setImageResource(mIndicatorUnselectedResId);
}
}
if (position==0) position=1;
switch (bannerStyle){
case CIRCLE_INDICATOR:
break;
case NUM_INDICATOR:
if (position>count) position=count;
numIndicator.setText(position+"/"+count);
break;
case NUM_INDICATOR_TITLE:
if (position>count) position=count;
numIndicator.setText(position+"/"+count);
if (titles!=null&&titles.length>0){
if (position>titles.length) position=titles.length;
bannerTitle.setText(titles[position-1]);
}
break;
case CIRCLE_INDICATOR_TITLE:
if (titles!=null&&titles.length>0){
if (position>titles.length) position=titles.length;
bannerTitle.setText(titles[position-1]);
}
break;
}
}
public void setOnBannerClickListener(OnBannerClickListener listener) {
this.listener = listener;
}
public void setOnBannerImageListener(OnLoadImageListener imageListener) {
this.imageListener = imageListener;
}
public interface OnBannerClickListener {
void OnBannerClick(View view, int position);
}
public interface OnLoadImageListener {
void OnLoadImage(ImageView view,Object url);
}
}
圆形图片裁剪CircleImageView
public class CircleImageView extends ImageView {
private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;
private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
private static final int COLORDRAWABLE_DIMENSION = 1;
private static final int DEFAULT_BORDER_WIDTH = 2;
private static final int DEFAULT_BORDER_COLOR = Color.WHITE;
private final RectF mDrawableRect = new RectF();
private final RectF mBorderRect = new RectF();
private final Matrix mShaderMatrix = new Matrix();
private final Paint mBitmapPaint = new Paint();
private final Paint mBorderPaint = new Paint();
private int mBorderColor = DEFAULT_BORDER_COLOR;
private int mBorderWidth = DEFAULT_BORDER_WIDTH;
private Bitmap mBitmap;
private BitmapShader mBitmapShader;
private int mBitmapWidth;
private int mBitmapHeight;
private float mDrawableRadius;
private float mBorderRadius;
private boolean mReady;
private boolean mSetupPending;
public CircleImageView(Context context) {
super(context);
}
public CircleImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
super.setScaleType(SCALE_TYPE);
mReady = true;
if (mSetupPending) {
setup();
mSetupPending = false;
}
}
@Override
public ScaleType getScaleType() {
return SCALE_TYPE;
}
@Override
public void setScaleType(ScaleType scaleType) {
if (scaleType != SCALE_TYPE) {
throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
}
}
@Override
protected void onDraw(Canvas canvas) {
if (getDrawable() == null) {
return;
}
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
setup();
}
public int getBorderColor() {
return mBorderColor;
}
public void setBorderColor(int borderColor) {
if (borderColor == mBorderColor) {
return;
}
mBorderColor = borderColor;
mBorderPaint.setColor(mBorderColor);
invalidate();
}
public int getBorderWidth() {
return mBorderWidth;
}
public void setBorderWidth(int borderWidth) {
if (borderWidth == mBorderWidth) {
return;
}
mBorderWidth = borderWidth;
setup();
}
@Override
public void setImageBitmap(Bitmap bm) {
super.setImageBitmap(bm);
mBitmap = bm;
setup();
}
@Override
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(drawable);
mBitmap = getBitmapFromDrawable(drawable);
setup();
}
@Override
public void setImageResource(int resId) {
super.setImageResource(resId);
mBitmap = getBitmapFromDrawable(getDrawable());
setup();
}
private Bitmap getBitmapFromDrawable(Drawable drawable) {
if (drawable == null) {
return null;
}
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
try {
Bitmap bitmap;
if (drawable instanceof ColorDrawable) {
bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
} catch (OutOfMemoryError e) {
return null;
}
}
private void setup() {
if (!mReady) {
mSetupPending = true;
return;
}
if (mBitmap == null) {
return;
}
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mBitmapPaint.setAntiAlias(true);
mBitmapPaint.setShader(mBitmapShader);
mBorderPaint.setStyle(Paint.Style.STROKE);
mBorderPaint.setAntiAlias(true);
mBorderPaint.setColor(mBorderColor);
mBorderPaint.setStrokeWidth(mBorderWidth);
mBitmapHeight = mBitmap.getHeight();
mBitmapWidth = mBitmap.getWidth();
mBorderRect.set(0, 0, getWidth(), getHeight());
mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);
mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);
mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);
updateShaderMatrix();
invalidate();
}
private void updateShaderMatrix() {
float scale;
float dx = 0;
float dy = 0;
mShaderMatrix.set(null);
if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
scale = mDrawableRect.height() / (float) mBitmapHeight;
dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
} else {
scale = mDrawableRect.width() / (float) mBitmapWidth;
dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
}
mShaderMatrix.setScale(scale, scale);
mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);
mBitmapShader.setLocalMatrix(mShaderMatrix);
}
}
栏目水平方向
public class ColumnHorizontalScrollView extends HorizontalScrollView {
/** 传入整体布局 */
private View ll_content;
/** 传入更多栏目选择布局 */
private View ll_more;
/** 传入拖动栏布局 */
private View rl_column;
/** 左阴影图片 */
private ImageView leftImage;
/** 右阴影图片 */
private ImageView rightImage;
/** 屏幕宽度 */
private int mScreenWitdh = 0;
/** 父类的活动activity */
private Activity activity;
public ColumnHorizontalScrollView(Context context) {
super(context);
}
public ColumnHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ColumnHorizontalScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
/**
* 在拖动的时候执行
* */
@Override
protected void onScrollChanged(int paramInt1, int paramInt2, int paramInt3, int paramInt4) {
// TODO Auto-generated method stub
super.onScrollChanged(paramInt1, paramInt2, paramInt3, paramInt4);
shade_ShowOrHide();
if(!activity.isFinishing() && ll_content !=null && leftImage!=null && rightImage!=null && ll_more!=null && rl_column !=null){
if(ll_content.getWidth() <= mScreenWitdh){
leftImage.setVisibility(View.GONE);
rightImage.setVisibility(View.GONE);
}
}else{
return;
}
if(paramInt1 ==0){
leftImage.setVisibility(View.GONE);
rightImage.setVisibility(View.VISIBLE);
return;
}
if(ll_content.getWidth() - paramInt1 + ll_more.getWidth() + rl_column.getLeft() == mScreenWitdh){
leftImage.setVisibility(View.VISIBLE);
rightImage.setVisibility(View.GONE);
return;
}
leftImage.setVisibility(View.VISIBLE);
rightImage.setVisibility(View.VISIBLE);
}
/**
* 传入父类布局中的资源文件
* */
public void setParam(Activity activity, int mScreenWitdh,View paramView1,ImageView paramView2, ImageView paramView3 ,View paramView4,View paramView5){
this.activity = activity;
this.mScreenWitdh = mScreenWitdh;
ll_content = paramView1;
leftImage = paramView2;
rightImage = paramView3;
ll_more = paramView4;
rl_column = paramView5;
}
/**
* 判断左右阴影的显示隐藏效果
* */
public void shade_ShowOrHide() {
if (!activity.isFinishing() && ll_content != null) {
measure(0, 0);
//如果整体宽度小于屏幕宽度的话,那左右阴影都隐藏
if (mScreenWitdh >= getMeasuredWidth()) {
leftImage.setVisibility(View.GONE);
rightImage.setVisibility(View.GONE);
}
} else {
return;
}
//如果滑动在最左边时候,左边阴影隐藏,右边显示
if (getLeft() == 0) {
leftImage.setVisibility(View.GONE);
rightImage.setVisibility(View.VISIBLE);
return;
}
//如果滑动在最右边时候,左边阴影显示,右边隐藏
if (getRight() == getMeasuredWidth() - mScreenWitdh) {
leftImage.setVisibility(View.VISIBLE);
rightImage.setVisibility(View.GONE);
return;
}
//否则,说明在中间位置,左、右阴影都显示
leftImage.setVisibility(View.VISIBLE);
rightImage.setVisibility(View.VISIBLE);
}
}
可以拖动添加的频道栏目(如今日头条)
public class DragGrid extends GridView {
/** 点击时候的X位置 */
public int downX;
/** 点击时候的Y位置 */
public int downY;
/** 点击时候对应整个界面的X位置 */
public int windowX;
/** 点击时候对应整个界面的Y位置 */
public int windowY;
/** 屏幕上的X */
private int win_view_x;
/** 屏幕上的Y*/
private int win_view_y;
/** 拖动的里x的距离 */
int dragOffsetX;
/** 拖动的里Y的距离 */
int dragOffsetY;
/** 长按时候对应postion */
public int dragPosition;
/** Up后对应的ITEM的Position */
private int dropPosition;
/** 开始拖动的ITEM的Position*/
private int startPosition;
/** item高 */
private int itemHeight;
/** item宽 */
private int itemWidth;
/** 拖动的时候对应ITEM的VIEW */
private View dragImageView = null;
/** 长按的时候ITEM的VIEW*/
private ViewGroup dragItemView = null;
/** WindowManager管理器 */
private WindowManager windowManager = null;
/** */
private WindowManager.LayoutParams windowParams = null;
/** item总量*/
private int itemTotalCount;
/** 一行的ITEM数量*/
private int nColumns = 4;
/** 行数 */
private int nRows;
/** 剩余部分 */
private int Remainder;
/** 是否在移动 */
private boolean isMoving = false;
/** */
private int holdPosition;
/** 拖动的时候放大的倍数 */
private double dragScale = 1.2D;
/** 震动器 */
private Vibrator mVibrator;
/** 每个ITEM之间的水平间距 */
private int mHorizontalSpacing = 15;
/** 每个ITEM之间的竖直间距 */
private int mVerticalSpacing = 15;
/* 移动时候最后个动画的ID */
private String LastAnimationID;
public DragGrid(Context context) {
super(context);
init(context);
}
public DragGrid(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public DragGrid(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public void init(Context context){
mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
//将布局文件中设置的间距dip转为px
mHorizontalSpacing = DataTools.dip2px(context, mHorizontalSpacing);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
downX = (int) ev.getX();
downY = (int) ev.getY();
windowX = (int) ev.getX();
windowY = (int) ev.getY();
setOnItemClickListener(ev);
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
boolean bool = true;
if (dragImageView != null && dragPosition != AdapterView.INVALID_POSITION) {
// 移动时候的对应x,y位置
bool = super.onTouchEvent(ev);
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) ev.getX();
windowX = (int) ev.getX();
downY = (int) ev.getY();
windowY = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
onDrag(x, y ,(int) ev.getRawX() , (int) ev.getRawY());
if (!isMoving){
OnMove(x, y);
}
if (pointToPosition(x, y) != AdapterView.INVALID_POSITION){
break;
}
break;
case MotionEvent.ACTION_UP:
stopDrag();
onDrop(x, y);
requestDisallowInterceptTouchEvent(false);
break;
default:
break;
}
}
return super.onTouchEvent(ev);
}
/** 在拖动的情况 */
private void onDrag(int x, int y , int rawx , int rawy) {
if (dragImageView != null) {
windowParams.alpha = 0.6f;
// windowParams.x = x - win_view_x + viewX;
// windowParams.y = y + win_view_y + viewY;
// windowParams.x = rawx - itemWidth / 2;
// windowParams.y = rawy - itemHeight / 2;
windowParams.x = rawx - win_view_x;
windowParams.y = rawy - win_view_y;
windowManager.updateViewLayout(dragImageView, windowParams);
}
}
/** 在松手下放的情况 */
private void onDrop(int x, int y) {
// 根据拖动到的x,y坐标获取拖动位置下方的ITEM对应的POSTION
int tempPostion = pointToPosition(x, y);
// if (tempPostion != AdapterView.INVALID_POSITION) {
dropPosition = tempPostion;
DragAdapter mDragAdapter = (DragAdapter) getAdapter();
//显示刚拖动的ITEM
mDragAdapter.setShowDropItem(true);
//刷新适配器,让对应的ITEM显示
mDragAdapter.notifyDataSetChanged();
// }
}
/**
* 长按点击监听
* @param ev
*/
public void setOnItemClickListener(final MotionEvent ev) {
setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
int x = (int) ev.getX();// 长安事件的X位置
int y = (int) ev.getY();// 长安事件的y位置
startPosition = position;// 第一次点击的postion
dragPosition = position;
if (startPosition <= 1) {
return false;
}
ViewGroup dragViewGroup = (ViewGroup) getChildAt(dragPosition - getFirstVisiblePosition());
TextView dragTextView = (TextView)dragViewGroup.findViewById(R.id.text_item);
dragTextView.setSelected(true);
dragTextView.setEnabled(false);
itemHeight = dragViewGroup.getHeight();
itemWidth = dragViewGroup.getWidth();
itemTotalCount = DragGrid.this.getCount();
int row = itemTotalCount / nColumns;// 算出行数
Remainder = (itemTotalCount % nColumns);// 算出最后一行多余的数量
if (Remainder != 0) {
nRows = row + 1;
} else {
nRows = row;
}
// 如果特殊的这个不等于拖动的那个,并且不等于-1
if (dragPosition != AdapterView.INVALID_POSITION) {
// 释放的资源使用的绘图缓存。如果你调用buildDrawingCache()手动没有调用setDrawingCacheEnabled(真正的),你应该清理缓存使用这种方法。
win_view_x = windowX - dragViewGroup.getLeft();//VIEW相对自己的X,半斤
win_view_y = windowY - dragViewGroup.getTop();//VIEW相对自己的y,半斤
dragOffsetX = (int) (ev.getRawX() - x);//手指在屏幕的上X位置-手指在控件中的位置就是距离最左边的距离
dragOffsetY = (int) (ev.getRawY() - y);//手指在屏幕的上y位置-手指在控件中的位置就是距离最上边的距离
dragItemView = dragViewGroup;
dragViewGroup.destroyDrawingCache();
dragViewGroup.setDrawingCacheEnabled(true);
Bitmap dragBitmap = Bitmap.createBitmap(dragViewGroup.getDrawingCache());
mVibrator.vibrate(50);//设置震动时间
startDrag(dragBitmap, (int)ev.getRawX(), (int)ev.getRawY());
hideDropItem();
dragViewGroup.setVisibility(View.INVISIBLE);
isMoving = false;
requestDisallowInterceptTouchEvent(true);
return true;
}
return false;
}
});
}
public void startDrag(Bitmap dragBitmap, int x, int y) {
stopDrag();
windowParams = new WindowManager.LayoutParams();// 获取WINDOW界面的
//Gravity.TOP|Gravity.LEFT;这个必须加
windowParams.gravity = Gravity.TOP | Gravity.LEFT;
// 计算当前项Left离窗体的距离
// windowParams.x = x - (int)((itemWidth / 2) * dragScale);
// windowParams.y = y - (int) ((itemHeight / 2) * dragScale);
//得到preview左上角相对于屏幕的坐标
windowParams.x = x - win_view_x;
windowParams.y = y - win_view_y;
// this.windowParams.x = (x - this.win_view_x + this.viewX);//位置的x值
// this.windowParams.y = (y - this.win_view_y + this.viewY);//位置的y值
//设置拖拽item的宽和高
windowParams.width = (int) (dragScale * dragBitmap.getWidth());// 放大dragScale倍,可以设置拖动后的倍数
windowParams.height = (int) (dragScale * dragBitmap.getHeight());// 放大dragScale倍,可以设置拖动后的倍数
this.windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
this.windowParams.format = PixelFormat.TRANSLUCENT;
this.windowParams.windowAnimations = 0;
ImageView iv = new ImageView(getContext());
iv.setImageBitmap(dragBitmap);
windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);// "window"
windowManager.addView(iv, windowParams);
dragImageView = iv;
}
/** 停止拖动 ,释放并初始化 */
private void stopDrag() {
if (dragImageView != null) {
windowManager.removeView(dragImageView);
dragImageView = null;
}
}
/** 在ScrollView内,所以要进行计算高度 */
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
/** 隐藏 放下 的ITEM*/
private void hideDropItem() {
((DragAdapter) getAdapter()).setShowDropItem(false);
}
/** 获取移动动画 */
public Animation getMoveAnimation(float toXValue, float toYValue) {
TranslateAnimation mTranslateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0F,
Animation.RELATIVE_TO_SELF,toXValue,
Animation.RELATIVE_TO_SELF, 0.0F,
Animation.RELATIVE_TO_SELF, toYValue);// 当前位置移动到指定位置
mTranslateAnimation.setFillAfter(true);// 设置一个动画效果执行完毕后,View对象保留在终止的位置。
mTranslateAnimation.setDuration(300L);
return mTranslateAnimation;
}
/** 移动的时候触发*/
public void OnMove(int x, int y) {
// 拖动的VIEW下方的POSTION
int dPosition = pointToPosition(x, y);
// 判断下方的POSTION是否是最开始2个不能拖动的
if (dPosition > 1) {
if ((dPosition == -1) || (dPosition == dragPosition)){
return;
}
dropPosition = dPosition;
if (dragPosition != startPosition){
dragPosition = startPosition;
}
int movecount;
//拖动的=开始拖的,并且 拖动的 不等于放下的
if ((dragPosition == startPosition) || (dragPosition != dropPosition)){
//移需要移动的动ITEM数量
movecount = dropPosition - dragPosition;
}else{
//移需要移动的动ITEM数量为0
movecount = 0;
}
if(movecount == 0){
return;
}
int movecount_abs = Math.abs(movecount);
if (dPosition != dragPosition) {
//dragGroup设置为不可见
ViewGroup dragGroup = (ViewGroup) getChildAt(dragPosition);
dragGroup.setVisibility(View.INVISIBLE);
float to_x = 1;// 当前下方positon
float to_y;// 当前下方右边positon
//x_vlaue移动的距离百分比(相对于自己长度的百分比)
float x_vlaue = ((float) mHorizontalSpacing / (float) itemWidth) + 1.0f;
//y_vlaue移动的距离百分比(相对于自己宽度的百分比)
float y_vlaue = ((float) mVerticalSpacing / (float) itemHeight) + 1.0f;
Log.d("x_vlaue", "x_vlaue = " + x_vlaue);
for (int i = 0; i < movecount_abs; i++) {
to_x = x_vlaue;
to_y = y_vlaue;
//像左
if (movecount > 0) {
// 判断是不是同一行的
holdPosition = dragPosition + i + 1;
if (dragPosition / nColumns == holdPosition / nColumns) {
to_x = - x_vlaue;
to_y = 0;
} else if (holdPosition % 4 == 0) {
to_x = 3 * x_vlaue;
to_y = - y_vlaue;
} else {
to_x = - x_vlaue;
to_y = 0;
}
}else{
//向右,下移到上,右移到左
holdPosition = dragPosition - i - 1;
if (dragPosition / nColumns == holdPosition / nColumns) {
to_x = x_vlaue;
to_y = 0;
} else if((holdPosition + 1) % 4 == 0){
to_x = -3 * x_vlaue;
to_y = y_vlaue;
}else{
to_x = x_vlaue;
to_y = 0;
}
}
ViewGroup moveViewGroup = (ViewGroup) getChildAt(holdPosition);
Animation moveAnimation = getMoveAnimation(to_x, to_y);
moveViewGroup.startAnimation(moveAnimation);
//如果是最后一个移动的,那么设置他的最后个动画ID为LastAnimationID
if (holdPosition == dropPosition) {
LastAnimationID = moveAnimation.toString();
}
moveAnimation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
isMoving = true;
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
// 如果为最后个动画结束,那执行下面的方法
if (animation.toString().equalsIgnoreCase(LastAnimationID)) {
DragAdapter mDragAdapter = (DragAdapter) getAdapter();
mDragAdapter.exchange(startPosition,dropPosition);
startPosition = dropPosition;
dragPosition = dropPosition;
isMoving = false;
}
}
});
}
}
}
}
}