package com.roboo.like.google; import android.app.ActionBar; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.DashPathEffect; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; import android.graphics.Paint.Cap; import android.net.Uri; import android.os.Bundle; import android.util.AttributeSet; import android.util.Log; import android.view.GestureDetector; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.BounceInterpolator; import android.view.animation.Interpolator; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Scroller; /** 心情界面 */ public class MoodActivity extends BaseActivity { private Button mBtnOpen; private CustomLinearLayout mCustomLinearLayout; /** 跳转到心情界面 */ public static void actionMood(Activity activity) { Intent intent = new Intent(activity, MoodActivity.class); activity.startActivity(intent); } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mood);// TODO customActionBar(); initView(); setListener(); } private void setListener() { OnClickListenerImpl onClickListenerImpl = new OnClickListenerImpl(); mBtnOpen.setOnClickListener(onClickListenerImpl); mCustomLinearLayout.setOnFlingListener(new OnFlingListener() { public void onRightFling() { // Toast.makeText(getApplicationContext(), "右", Toast.LENGTH_SHORT).show(); ContacterActivity.actionContacter(MoodActivity.this); } @Override public void onLeftFling() { // Toast.makeText(getApplicationContext(), "左", Toast.LENGTH_SHORT).show(); MoodActivity.this.finish(); } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); break; } return super.onOptionsItemSelected(item); } public void initView() { mCustomLinearLayout = (CustomLinearLayout) findViewById(R.id.custom_linear_container); mBtnOpen = (Button) findViewById(R.id.btn_open); } private void customActionBar() { ActionBar mActionBar = getActionBar(); mActionBar.setDisplayHomeAsUpEnabled(true); mActionBar.setTitle("心情"); mActionBar.setLogo(R.drawable.ic_abs_mood_up); } private class OnClickListenerImpl implements OnClickListener { public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("kugou://start.weixin?filename=ee")); startActivity(intent); } } } class CustomLinearLayout extends LinearLayout { private int mTriggerThreshold; private static final String TAG = "CustomView"; private static final int CLIP_HEIGHT = 100; private OnFlingListener mOnFlingListener; private Scroller mScroller; private GestureDetector mGestureDetector; private Bitmap mCanvasBitmap; private Paint mCanvasPaint; private Region mCanvasRegion; public boolean status = HIDE;// 显示还是隐藏的状态,最开始为HIDE public static final boolean SHOW = true;// 显示图片 public static final boolean HIDE = false;// 隐藏图片 public CustomLinearLayout(Context context) { this(context, null); } public CustomLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); setClickable(true); setLongClickable(true); init(); } private void init() { Interpolator interpolator = new BounceInterpolator(); mScroller = new Scroller(getContext(), interpolator); mGestureDetector = new GestureDetector(getContext(), new CustomGestureListener()); mTriggerThreshold = (int) (100 * getResources().getDisplayMetrics().density); mCanvasBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_image2); mCanvasRegion = new Region(); mCanvasPaint = new Paint(); /* http://blog.csdn.net/a859522265/article/details/8889024 */ setWillNotDraw(false);// 清除ViewGroup不绘制自身的标志 ,导致onDraw()方法的调用, 或者设置background同理。 } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { System.out.println("widthMeasureSpec = " + widthMeasureSpec + " heightMeasureSpec = " + heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); System.out.println("widthMode = " + widthMode + " heightMode = " + heightMode); System.out.println("AT_MOST = " + MeasureSpec.AT_MOST + " EXACTLY = " + MeasureSpec.EXACTLY + " UNSPECIFIED = " + MeasureSpec.UNSPECIFIED); int measuredWidth = MeasureSpec.getSize(widthMeasureSpec); int measuredHeight = MeasureSpec.getSize(heightMeasureSpec); System.out.println("measuredWidth = " + measuredWidth + " measuredHeight = " + measuredHeight); // int childWidthMeasureSpec = makeChildWidthMeasureSpec(); // int childHeightMeasureSpec = makeChildHeightMeasureSpec(); // measureChildren(childWidthMeasureSpec, childHeightMeasureSpec); measureChildren(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(measuredWidth, measuredHeight);// 如果调用这句话,子view不会出现,除非调用measureChildren方法。 } protected int makeChildHeightMeasureSpec() { int height = 100; return MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); } protected int makeChildWidthMeasureSpec() { int width = 800; return MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { System.out.println("changed = " + changed + " l = " + l + " t = " + t + " r = " + r + " b = " + b); int childCount = getChildCount(); System.out.println("childCount = " + childCount); for (int i = 0; i < childCount; i++) { View childView = getChildAt(i); // 此处应该计算子view的宽度和高度 int childMeasureWidth = childView.getMeasuredWidth(); int childMeasureHeight = childView.getMeasuredHeight(); int width = childView.getWidth(); int height = childView.getHeight(); System.out.println("childMeasureWidth = " + childMeasureWidth + " childMeasureHeight = " + childMeasureHeight + "子View布局前计算的 width = " + width + " height = " + height); childView.layout(l, t, childMeasureWidth, childMeasureHeight); width = childView.getWidth(); height = childView.getHeight(); System.out.println(" 子View布局后计算的 width = " + width + " height = " + height); } // super.onLayout(changed, l, childCount, r, b);//如果没有调用父方法, 会导致子view没有布局而显示不出来, 除非调用子view的childView.layout(l, t, r, b)方法。 } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawARGB(88, 255, 22, 22); mCanvasPaint.setFlags(Paint.FILTER_BITMAP_FLAG); // canvas.saveLayerAlpha(0, 0, 800, 800, 66, Canvas.HAS_ALPHA_LAYER_SAVE_FLAG); canvas.drawBitmap(mCanvasBitmap, 55, 150, mCanvasPaint); drawSomthing(canvas); } private void drawSomthing(Canvas canvas) { canvas.save(); Paint paint = new Paint(); float top = 60 * getResources().getDisplayMetrics().density; float left = 100; RectF rect = new RectF(left, top + 500, left + 500, top + 500 + 500); paint.setColor(Color.RED); // canvas.drawRect(left, top, left + 400, top + 400, paint); // paint.setColor(Color.BLUE); // canvas.drawRoundRect(rect , 40, 40, paint); rect.right = rect.left + 870; canvas.drawRect(rect, paint); paint.setStyle(Paint.Style.STROKE); paint.setStrokeCap(Cap.ROUND); paint.setStrokeWidth(20); DashPathEffect pathEffect = new DashPathEffect(new float[] { 4, 30, 8, 40 }, 1); paint.setPathEffect(pathEffect); canvas.drawLine(left, top+40, left+600, top+40, paint); canvas.restore(); } @Override protected void dispatchDraw(Canvas canvas)// 在绘制自己之后并且在绘制子View之前调用, { // canvas.translate(100, 0); super.dispatchDraw(canvas); } public void setOnFlingListener(OnFlingListener onFlingListener) { this.mOnFlingListener = onFlingListener; } // 调用此方法滚动到目标位置 public void smoothScrollTo(int fx, int fy) { int dx = fx - mScroller.getFinalX(); int dy = fy - mScroller.getFinalY(); smoothScrollBy(dx, dy); } // 调用此方法设置滚动的相对偏移 public void smoothScrollBy(int dx, int dy) { if (null != mOnFlingListener) { if (dx > mTriggerThreshold) { mOnFlingListener.onLeftFling(); } else if (dx < -mTriggerThreshold) { mOnFlingListener.onRightFling(); } } // 设置mScroller的滚动偏移量 mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy); invalidate();// 这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果 } @Override public void computeScroll() { // 先判断mScroller滚动是否完成 if (mScroller.computeScrollOffset()) { // 这里调用View的scrollTo()完成实际的滚动 scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); // 必须调用该方法,否则不一定能看到滚动效果 postInvalidate(); } super.computeScroll(); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP: Log.i(TAG, " ScorllY = " + getScrollY() + " ScrollX = " + getScrollX()); smoothScrollTo(0, 0); break; default: return mGestureDetector.onTouchEvent(event); } return super.onTouchEvent(event); } class CustomGestureListener implements GestureDetector.OnGestureListener { public boolean onDown(MotionEvent e) { return true; } public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { int disY = (int) ((distanceY - 0.5) / 2); int disX = (int) ((distanceX - 0.5) / 2); Log.i(TAG, "disX =" + disX + " disY = " + disY); if ((Math.abs(disX) - Math.abs(disY)) >= 0) { smoothScrollBy(disX, 0); } else { smoothScrollBy(0, disY); } return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } } } // class CustomLinearLayout extends LinearLayout // { // private int mTriggerThreshold; // private static final String TAG = "CustomView"; // private OnFlingListener mOnFlingListener; // private Scroller mScroller; // private GestureDetector mGestureDetector; // // public CustomLinearLayout(Context context) // { // this(context, null); // } // // public CustomLinearLayout(Context context, AttributeSet attrs) // { // super(context, attrs); // setClickable(true); // setLongClickable(true); // init(); // // } // // private void init() // { // Interpolator interpolator = new BounceInterpolator(); // mScroller = new Scroller(getContext(), interpolator); // // mGestureDetector = new GestureDetector(getContext(), new CustomGestureListener()); // mTriggerThreshold = (int) (100 * getResources().getDisplayMetrics().density); // } // // public void setOnFlingListener(OnFlingListener onFlingListener) // { // this.mOnFlingListener = onFlingListener; // } // // // 调用此方法滚动到目标位置 // public void smoothScrollTo(int fx, int fy) // { // int dx = fx - mScroller.getFinalX(); // int dy = fy - mScroller.getFinalY(); // smoothScrollBy(dx, dy); // } // // // 调用此方法设置滚动的相对偏移 // public void smoothScrollBy(int dx, int dy) // { // if (null != mOnFlingListener) // { // if (dx > mTriggerThreshold) // { // mOnFlingListener.onLeftFling(); // } // else if(dx < -mTriggerThreshold) // { // mOnFlingListener.onRightFling(); // } // } // // 设置mScroller的滚动偏移量 // mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy); // invalidate();// 这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果 // } // // @Override // public void computeScroll() // { // // 先判断mScroller滚动是否完成 // if (mScroller.computeScrollOffset()) // { // // 这里调用View的scrollTo()完成实际的滚动 // scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); // // 必须调用该方法,否则不一定能看到滚动效果 // postInvalidate(); // } // super.computeScroll(); // } // // @Override // public boolean onTouchEvent(MotionEvent event) // { // switch (event.getAction()) // { // case MotionEvent.ACTION_UP: // Log.i(TAG, " ScorllY = " + getScrollY() + " ScrollX = " + getScrollX()); // smoothScrollTo(0, 0); // break; // default: // return mGestureDetector.onTouchEvent(event); // } // return super.onTouchEvent(event); // } // // class CustomGestureListener implements GestureDetector.OnGestureListener // { // public boolean onDown(MotionEvent e) // { // return true; // } // // public void onShowPress(MotionEvent e) // { // // } // // @Override // public boolean onSingleTapUp(MotionEvent e) // { // return false; // } // // @Override // public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) // { // int disY = (int) ((distanceY - 0.5) / 2); // int disX = (int) ((distanceX - 0.5) / 2); // Log.i(TAG, "disX =" + disX + " disY = " + disY); // if ((Math.abs(disX) - Math.abs(disY)) >= 0) // { // smoothScrollBy(disX, 0); // } // else // { // smoothScrollBy(0, disY); // } // // return false; // } // // @Override // public void onLongPress(MotionEvent e) // { // // } // // @Override // public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) // { // return false; // } // // } // } interface OnFlingListener { public void onLeftFling(); public void onRightFling(); }