Android仿開心消消樂大樹星星無限循環(huán)效果
啥都不說先上效果圖,這個(gè)是我項(xiàng)目里的效果:
下面的是我抽取出來的 demo 適配啥的我基本上都做好了沒做其他的
ok 下面 說一下思路把
首先 說一下原理 我是使用bitmap 創(chuàng)建兩張圖 一開始的時(shí)候 一張?jiān)谙旅嬗洖?號(hào) 一張?jiān)谏厦?記為2號(hào)
當(dāng)手指向下滑動(dòng)時(shí) 判斷 1號(hào) 的起點(diǎn)位置 是否完全超出屏幕 如果超出屏幕的話 那么將2號(hào)變?yōu)橄旅?1號(hào)變?yōu)樯厦?(移動(dòng)1號(hào)的Y坐標(biāo)) 大體思路 是這樣. 里面還有許多判斷
比如 是否能向下滑動(dòng) 起點(diǎn)位置, 星星的判定 哎呀 好煩 說的東西太多啦 來張我的草稿紙 哈哈 話說我草稿都寫了好幾頁
先上代碼:
/** * Created by liuml on 2016/6/11. */ public class MyScrollView extends View { // 其資源引用的是同一張圖片 private Bitmap bmpBackGround1; private Bitmap bmpBackGround2; int speed; int pointX; int tempy1; private Context mcontext; private int isfirst = 1; // 按鈕的坐標(biāo) private int btnX, btnY; // 按鈕是否按下標(biāo)識(shí)位 private Boolean isPress; // 界面背景坐標(biāo) private int bg1x, bg1y, bg2x, bg2y; private int cloudx, cloudy; List<Map<String, Object>> mapList; // 星星坐標(biāo) private int stars0X, stars0Y, stars1X, stars1Y, stars2X, stars2Y, stars3X, stars3Y, stars4X, stars4Y, stars5X, stars5Y, stars6X, stars6Y, stars7X, stars7Y, stars8X, stars8Y, stars9X, stars9Y, stars10X, stars10Y; // //定義第二頁的星星坐標(biāo) private int MaxStars = 80;// 最大的星星數(shù)量 80個(gè) private int textContnt[] = new int[MaxStars];// 數(shù)字 private int pointsY[]; private int pointsX[]; private int pointY, moveY = 0; private int activityNumber = 2; private Bitmap treeBackGround;// 界面背景 private Bitmap cloud_bg;// 界面背景 private Bitmap starsBg;// 星星 private Bitmap starsBg_n;// 星星未做的 // 聲明一個(gè)Resources實(shí)例便于加載圖片 private Resources res = this.getResources(); // 聲明一個(gè)畫筆 private Paint paint; private DisplayMetrics dm; // 獲取屏幕分辨率的類 // private Scroller mScroller; private boolean isFirst = true; // 點(diǎn)擊事件星星相關(guān) int mDownX = 0; int mDownY = 0; int mTempX = 0; int mTempY = 0; private static final int MAX_DISTANCE_FOR_CLICK = 100; private ScrollViewListener listener; private int screenHeight; private int screenWidth; public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); mcontext = context; // 背景加載資源 treeBackGround = BitmapFactory.decodeResource(res, R.drawable.tree); cloud_bg = BitmapFactory.decodeResource(res, R.drawable.cloud_bg); starsBg = BitmapFactory.decodeResource(res, R.drawable.stars_big); starsBg_n = BitmapFactory.decodeResource(res, R.drawable.startbg_n); this.bmpBackGround1 = treeBackGround; this.bmpBackGround2 = treeBackGround; bg1x = 0; bg2x = 0; cloudx = 0; pointsY = new int[22];// Y軸 pointsX = new int[22];// X軸 screenHeight = DisplayUtils.getScreenHeight(context); screenWidth = DisplayUtils.getScreenWidth(context); initStartsXY(); initTextContent(); // mScroller = new Scroller(context); // LogUtils.d("屏幕 分別率 高 = " + DisplayUtils.getScreenHeight(context) + // " 屏幕 分別率 寬度 = " + DisplayUtils.getScreenWidth(context)); // LogUtils.d("屏幕 分別率 getDisplayDensity = " + // DisplayUtils.getDisplayDensity(context)); } public void setMapList(List list) { mapList = list; } // //調(diào)用此方法滾動(dòng)到目標(biāo)位置 // public void smoothScrollTo(int fx, int fy) { // int dx = fx - mScroller.getFinalX(); // int dy = fy - mScroller.getFinalY(); // smoothScrollBy(dx, dy); // } // // //調(diào)用此方法設(shè)置滾動(dòng)的相對(duì)偏移 // public void smoothScrollBy(int dx, int dy) { // // //設(shè)置mScroller的滾動(dòng)偏移量 // mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, // dy); // invalidate();//這里必須調(diào)用invalidate()才能保證computeScroll()會(huì)被調(diào)用,否則不一定會(huì)刷新界面,看不到滾動(dòng)效果 // } // // @Override // public void computeScroll() { // //先判斷mScroller滾動(dòng)是否完成 // if (mScroller.computeScrollOffset()) { // // //這里調(diào)用View的scrollTo()完成實(shí)際的滾動(dòng) // scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); // // //必須調(diào)用該方法,否則不一定能看到滾動(dòng)效果 // postInvalidate(); // } // super.computeScroll(); // } private void initTextContent() { for (int i = 0; i < MaxStars; i++) { textContnt[i] = i + 1; } } public void setOnclick(ScrollViewListener listener) { this.listener = listener; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 首先讓第一張背景底部正好填滿整個(gè)屏幕 int treeHeight = bmpBackGround1.getHeight() - getHeight(); // LogUtils.d("bg1y = " + bg1y + " bmpBackGround1.getHeight() = " + // bmpBackGround1.getHeight() // + " getHeight() = " + getHeight()); if (treeHeight > 0) {// 圖高大于屏幕高度 // 第二張背景圖緊接在第一張背景的上方 // 雖然兩張背景圖無縫隙連接但是因?yàn)閳D片資源頭尾 // 直接連接不和諧,為了讓視覺看不出是兩張圖連接而修正的位置 bg1y = -(bmpBackGround1.getHeight() - getHeight()); bg2y = bg1y - bmpBackGround1.getHeight();// 這里可以+100 // 可以控制兩張圖之間的距離修正位置 } else { bg1y = Math.abs(bmpBackGround1.getHeight() - getHeight()); bg2y = bg1y - bmpBackGround1.getHeight();// 這里可以+100 // 可以控制兩張圖之間的距離修正位置 } // LogUtils.d("cloudy = " + cloudy + " bg1y = " + bg1y + " bg2y = " + // bg2y + " screenH = " + getHeight()); // 實(shí)例一個(gè)畫筆 paint = new Paint(); paint.setAntiAlias(true);// 設(shè)置沒有鋸齒 // 設(shè)置畫筆顏色為白色 paint.setColor(Color.WHITE); } @Override protected void onDraw(Canvas canvas) { // LogUtils.d("屏幕 分別率 h = " + getHeight()); // LogUtils.d("屏幕 分別率 w = " + getWidth()); // 畫云背景 canvas.drawBitmap(resizeBitmap(cloud_bg, getWidth(), getHeight()), cloudx, cloudy, paint); // drawImage(canvas, cloud_bg, cloudx, cloudy, cloud_bg.getWidth(), // cloud_bg.getHeight(), cloudx, cloudy, paint); // 繪制兩張背景 if (isFirst) { bmpBackGround1 = resizeBitmap(bmpBackGround1, getWidth(), getHeight()); isFirst = false; initBgView(); } canvas.drawBitmap(bmpBackGround1, bg1x, bg1y, paint); canvas.drawBitmap(bmpBackGround1, bg2x, bg2y, paint); // LogUtils.d("bmpBackGround1.getHeight() = " + // bmpBackGround1.getHeight() + " screenH = " + getHeight() + // " bg1y = " + bg1y); // LogUtils.d("bg1x = " + bg1x + " bg1y = " + bg1y + " bg2x = " + bg2x // + " bg2y = " + bg2y + " screenH = " + getHeight()); starsDraw(canvas);// 繪制星星 TextViewDraw(canvas);// 繪制文本 super.onDraw(canvas); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { boolean isDown; // speed = t - oldt; // // //判斷向上移動(dòng)還是向下移動(dòng) // if (speed > 0) { // isDown = true; // } else { // isDown = false; // } // logic(isDown);//計(jì)算點(diǎn)的距離 super.onScrollChanged(l, t, oldl, oldt); } public Bitmap resizeBitmap(Bitmap bitmap, int w, int h) { if (bitmap != null) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); int newWidth = w; int newHeight = h; float scaleWight = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; Matrix matrix = new Matrix(); matrix.postScale(scaleWight, scaleHeight); Bitmap res = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);// oom問題 待解決 return res; } else { return null; } } // 畫文字 private void TextViewDraw(Canvas canvas) { // 判斷當(dāng)前畫的是第幾個(gè) int c = activityNumber * 11; int k = 0; if (activityNumber > 2) { k = c - ((activityNumber - 1) * 10); } // LogUtils.d("比例 x 28 = " + (double) 28 / screenWidth); // LogUtils.d("比例 y 65 = " + (double) 65 / screenHeight); // LogUtils.d("比例 x 40 = " + (double) 40 / screenWidth); for (int i = 0; i < 22; i++) { paint.setTextSize((int) (0.037037037037037035 * screenWidth));// 設(shè)置字體大小 // paint.setTypeface(typeface);//設(shè)置字體類型 // Typeface.DEFAULT:默認(rèn)字體。 // Typeface.DEFAULT_BOLD:加粗字體。 // Typeface.MONOSPACE:monospace字體。 // Typeface.SANS_SERIF:sans字體。 // Typeface.SERIF:serif字體。 paint.setColor(Color.BLUE); // 每頁第幾個(gè) 我推算出來的公式 (x-1)*11+i 這是普通的推算 具體問題 需要具體改變 // setTextColorUseReflection(Color.BLUE); paint.setStrokeWidth(2); // 描邊寬度 paint.setFakeBoldText(true); // 外層text采用粗體 if (activityNumber <= 2) { if (textContnt[i] > 9) { paint.setColor(res.getColor(R.color.text_color)); canvas.drawText( String.valueOf(textContnt[i]), pointsX[i] + (int) (0.025925925925925925 * screenWidth), pointsY[i] + (int) (0.033854166666666664 * screenHeight), paint); } else { paint.setColor(res.getColor(R.color.text_color)); canvas.drawText( String.valueOf(textContnt[i]), pointsX[i] + (int) (0.037037037037037035 * screenWidth), pointsY[i] + (int) (0.033854166666666664 * screenHeight), paint); } } else { // 下面的都是從在這里做操作對(duì)text 數(shù)值 // int u = (activityNumber - 2) * 11 + i-11; // 必須分前后 前面的 是一隊(duì) 后面的是一隊(duì) if (activityNumber % 2 != 0) {// 第三個(gè)開始 奇數(shù) 是第二個(gè)頁面在下面 第一個(gè)頁面在上 // 判斷上下的 作用 int befo;// (n-1)*11+i int after; if (i < 11) {// 數(shù)組前面的 befo = (activityNumber - 1) * 11 + i; if (befo < MaxStars) { if (textContnt[befo] > 9) { paint.setColor(res.getColor(R.color.text_color)); canvas.drawText( String.valueOf(textContnt[befo]), pointsX[i] + (int) (0.025925925925925925 * screenWidth), pointsY[i] + (int) (0.033854166666666664 * screenHeight), paint); } else { paint.setColor(res.getColor(R.color.text_color)); canvas.drawText( String.valueOf(textContnt[befo]), pointsX[i] + (int) (0.037037037037037035 * screenWidth), pointsY[i] + (int) (0.033854166666666664 * screenHeight), paint); } } } else {// 數(shù)組后面的 after = (activityNumber - 3) * 11 + i; if (after < MaxStars) { if (textContnt[after] > 9) { paint.setColor(res.getColor(R.color.text_color)); canvas.drawText( String.valueOf(textContnt[after]), pointsX[i] + (int) (0.025925925925925925 * screenWidth), pointsY[i] + (int) (0.033854166666666664 * screenHeight), paint); } else { paint.setColor(res.getColor(R.color.text_color)); canvas.drawText( String.valueOf(textContnt[after]), pointsX[i] + (int) (0.037037037037037035 * screenWidth), pointsY[i] + (int) (0.033854166666666664 * screenHeight), paint); } } } } else { int befo;// (n-1)*11+i int after; if (i < 11) {// 數(shù)組前面的 befo = (activityNumber - 2) * 11 + i; if (befo < MaxStars) { if (textContnt[befo] > 9) { paint.setColor(res.getColor(R.color.text_color)); canvas.drawText( String.valueOf(textContnt[befo]), pointsX[i] + (int) (0.025925925925925925 * screenWidth), pointsY[i] + (int) (0.033854166666666664 * screenHeight), paint); } else { paint.setColor(res.getColor(R.color.text_color)); canvas.drawText( String.valueOf(textContnt[befo]), pointsX[i] + (int) (0.037037037037037035 * screenWidth), pointsY[i] + (int) (0.033854166666666664 * screenHeight), paint); } } } else {// 數(shù)組后面的 after = (activityNumber - 2) * 11 + i; if (after < MaxStars) { if (textContnt[after] > 9) { paint.setColor(res.getColor(R.color.text_color)); canvas.drawText( String.valueOf(textContnt[after]), pointsX[i] + (int) (0.025925925925925925 * screenWidth), pointsY[i] + (int) (0.033854166666666664 * screenHeight), paint); } else { paint.setColor(res.getColor(R.color.text_color)); canvas.drawText( String.valueOf(textContnt[after]), pointsX[i] + (int) (0.037037037037037035 * screenWidth), pointsY[i] + (int) (0.033854166666666664 * screenHeight), paint); } } } } } // LogUtils.d("pointsY [" + i + "]= " + pointsY[i]); } paint.setColor(Color.WHITE); } // 獲取當(dāng)前頁數(shù)的開始數(shù)量 private int getCurrent(int i) { int befo; // 判斷上下 if (activityNumber % 2 != 0) {// 奇數(shù) 第一頁在上 第二頁在下 befo = (activityNumber - 1) * 11 + i; // LogUtils.d("befo = " + befo + " activityNumber = " + // activityNumber + " i = " + i); } else { befo = (activityNumber - 2) * 11 + i; } return befo; } // 獲取點(diǎn)擊的位置的數(shù)字 private int getOnclickNo(int i) { int befo;// (n-1)*11+i int after; // 判斷上下 if (activityNumber % 2 != 0) {// 奇數(shù) 第一頁在上 第二頁在下 if (i < 11) { befo = (activityNumber - 1) * 11 + i; // LogUtils.d("i 小于11 befo = " + befo + " activityNumber = " // + activityNumber + " i = " + i); } else { befo = (activityNumber - 3) * 11 + i; // LogUtils.d("i 大于11 befo = " + befo + " activityNumber = " // + activityNumber + " i = " + i); } } else { if (i < 11) { befo = (activityNumber - 2) * 11 + i; // LogUtils.d(" 偶數(shù)的時(shí)候 befo = " + befo + " activityNumber = " // + activityNumber + " i = " + i); } else { befo = (activityNumber - 2) * 11 + i; } } return befo; } private void starsDraw(Canvas canvas) { // 判斷畫一頁當(dāng)中 最多的星星 是多少 int starsMax = (activityNumber) * 11; int page; if (starsMax > MaxStars) {// 判斷當(dāng)前的最多的星星是否大于定好的星星數(shù)量 if (mapList == null) { for (int i = 0; i < 22; i++) { // 判斷當(dāng)前畫的是第幾個(gè) page = getCurrent(i); // LogUtils.d("當(dāng)前畫的是第幾個(gè) = " + page); canvas.drawBitmap(starsBg_n, pointsX[i], pointsY[i], paint); } } else { for (int i = 0; i < 22; i++) { // 判斷當(dāng)前畫的是第幾個(gè) page = getCurrent(i); // LogUtils.d("當(dāng)前的 最前面的是多少 current = " + page); if (page < MaxStars) { if (page < i) { Map<String, Object> stringObjectMap = mapList .get(page); String type = (String) stringObjectMap.get("type"); if (type.equals("1")) { canvas.drawBitmap(starsBg, pointsX[i], pointsY[i], paint); } else { canvas.drawBitmap(starsBg_n, pointsX[i], pointsY[i], paint); } } else { canvas.drawBitmap(starsBg_n, pointsX[i], pointsY[i], paint); } } // LogUtils.d("pointsY [" + i + "]= " + pointsY[i]); } } } else { if (mapList == null) { for (int i = 0; i < 22; i++) { // 判斷當(dāng)前畫的是第幾個(gè) page = getCurrent(i); // LogUtils.d("當(dāng)前畫的是第幾個(gè) = " + page); canvas.drawBitmap(starsBg_n, pointsX[i], pointsY[i], paint); } } else { int size = mapList.size(); for (int i = 0; i < 22; i++) { // 判斷當(dāng)前畫的是第幾個(gè) page = getCurrent(i); // LogUtils.d("當(dāng)前畫的是第幾個(gè) = " + page); if (page < size) { Map<String, Object> stringObjectMap = mapList.get(page); String type = (String) stringObjectMap.get("type"); if (type.equals("1")) { canvas.drawBitmap(starsBg, pointsX[i], pointsY[i], paint); } else { canvas.drawBitmap(starsBg_n, pointsX[i], pointsY[i], paint); } } else { canvas.drawBitmap(starsBg_n, pointsX[i], pointsY[i], paint); } } } } } private void canvasStats() { } private void initStartsXY() { stars0X = 340;// stars0Y = 1180;// stars1X = 280; stars1Y = 1065; stars2X = 500; stars2Y = 967; stars3X = 240; stars3Y = 842; stars4X = 400; stars4Y = 761; stars5X = 540; stars5Y = 685; stars6X = 330; stars6Y = 526; stars7X = 540; stars7Y = 431; stars8X = 375; stars8Y = 245; stars9X = 550; stars9Y = 113; stars10X = 310; stars10Y = 57; speed = 0; pointsX[0] = (int) (screenWidth * 0.39351851851851855); pointsX[1] = (int) (screenWidth * 0.25925925925925924); pointsX[2] = (int) (screenWidth * 0.46296296296296297); pointsX[3] = (int) (screenWidth * 0.2222222222222222); pointsX[4] = (int) (screenWidth * 0.37037037037037035); pointsX[5] = (int) (screenWidth * 0.5); pointsX[6] = (int) (screenWidth * 0.3055555555555556); pointsX[7] = (int) (screenWidth * 0.5); pointsX[8] = (int) (screenWidth * 0.3472222222222222); pointsX[9] = (int) (screenWidth * 0.5092592592592593); pointsX[10] = (int) (screenWidth * 0.28703703703703703); // pointsX[0] = stars0X; // pointsX[1] = stars1X; // pointsX[2] = stars2X; // pointsX[3] = stars3X; // pointsX[4] = stars4X; // pointsX[5] = stars5X; // pointsX[6] = stars6X; // pointsX[7] = stars7X; // pointsX[8] = stars8X; // pointsX[9] = stars9X; // pointsX[10] = stars10X; pointsX[11] = pointsX[0]; pointsX[12] = pointsX[1]; pointsX[13] = pointsX[2]; pointsX[14] = pointsX[3]; pointsX[15] = pointsX[4]; pointsX[16] = pointsX[5]; pointsX[17] = pointsX[6]; pointsX[18] = pointsX[7]; pointsX[19] = pointsX[8]; pointsX[20] = pointsX[9]; pointsX[21] = pointsX[10]; pointsY[0] = stars0Y; pointsY[1] = stars1Y; pointsY[2] = stars2Y; pointsY[3] = stars3Y; pointsY[4] = stars4Y; pointsY[5] = stars5Y; pointsY[6] = stars6Y; pointsY[7] = stars7Y; pointsY[8] = stars8Y; pointsY[9] = stars9Y; pointsY[10] = stars10Y; // pointsY[0] = (int) (screenHeight * 0.6145833333333334); // pointsY[1] = (int) (screenHeight * 0.5546875); // pointsY[2] = (int) (screenHeight * 0.5036458333333333); // pointsY[3] = (int) (screenHeight * 0.43854166666666666); // pointsY[4] = (int) (screenHeight * 0.3963541666666667); // pointsY[5] = (int) (screenHeight * 0.3411458333333333); // pointsY[6] = (int) (screenHeight * 0.27395833333333336); // pointsY[7] = (int) (screenHeight * 0.22447916666666667); // pointsY[8] = (int) (screenHeight * 0.12760416666666666); // pointsY[9] = (int) (screenHeight * 0.058854166666666666); // pointsY[10] = (int) (screenHeight * 0.0296875); pointsY[11] = pointsY[0] - (bmpBackGround1.getHeight()); pointsY[12] = pointsY[1] - (bmpBackGround1.getHeight()); pointsY[13] = pointsY[2] - (bmpBackGround1.getHeight()); pointsY[14] = pointsY[3] - (bmpBackGround1.getHeight()); pointsY[15] = pointsY[4] - (bmpBackGround1.getHeight()); pointsY[16] = pointsY[5] - (bmpBackGround1.getHeight()); pointsY[17] = pointsY[6] - (bmpBackGround1.getHeight()); pointsY[18] = pointsY[7] - (bmpBackGround1.getHeight()); pointsY[19] = pointsY[8] - (bmpBackGround1.getHeight()); pointsY[20] = pointsY[9] - (bmpBackGround1.getHeight()); pointsY[21] = pointsY[10] - (bmpBackGround1.getHeight()); for (int i = 0; i < 11; i++) { double x = (double) pointsX[i] / screenWidth; DecimalFormat df = new DecimalFormat("0.00");// 格式化小數(shù),.后跟幾個(gè)零代表幾位小數(shù) LogUtils.d("比例 i " + i + " x = " + x); } for (int i = 0; i < 11; i++) { double y = (double) pointsY[i] / screenHeight; DecimalFormat df = new DecimalFormat("0.00");// 格式化小數(shù),.后跟幾個(gè)零代表幾位小數(shù) LogUtils.d("比例 i " + i + " y = " + y); } // float y = (float) 10 / screenHeight; // float x = (float) 10 / screenWidth; // LogUtils.d("比例 i 10 x = " + x + "比例 i 10 y = " + // y); } private void speedStarsXY() { for (int i = 0; i < 22; i++) { pointsY[i] += speed; } } private void setStartsXYDown(int type) { // LogUtils.d("pointy 0 之前= " + pointsY[0]); // LogUtils.d("pointy 11之前 = " + pointsY[11]); if (type == 0) { for (int i = 0; i < 11; i++) { int p = pointsY[i + 11]; pointsY[i] = p - (bmpBackGround1.getHeight()); // LogUtils.d("改變 后的 pointsY[" + i + "] = " + pointsY[i]); } } else { for (int i = 0; i < 11; i++) { // LogUtils.d("向下的第二種 pointsY[i+ 11] " + (pointsY[i] - // (bmpBackGround1.getHeight()))); int p = pointsY[i]; pointsY[i + 11] = p - (bmpBackGround1.getHeight()); // LogUtils.d("改變 后的 向下的第二種 pointsY[" + i + "] = " + // pointsY[i]); } } } private void setStartsXYUp(int type) { if (type == 0) { for (int i = 0; i < 11; i++) { pointsY[i] = pointsY[i + 11] + (bmpBackGround1.getHeight()); } } else { for (int i = 0; i < 11; i++) { pointsY[i + 11] = pointsY[i] + (bmpBackGround1.getHeight()); } } } @Override public boolean onTouchEvent(MotionEvent event) { // 獲取當(dāng)前觸控位置 // LogUtils.d("觸摸事件 event.getAction() = " + event.getAction()); int x = (int) event.getX(); int y = (int) event.getY(); boolean isDown; switch (event.getAction()) { case MotionEvent.ACTION_DOWN:// 當(dāng)用戶是按下 pointX = x; pointY = y; mDownX = (int) event.getX(); mDownY = (int) event.getY(); LogUtils.d(" 按下的 點(diǎn) x = " + pointX + " y = " + pointY); // LogUtils.d(" 按下的 點(diǎn)的比例 x = " + (double) pointX / screenWidth + // " y = " + (double) pointY / screenHeight); break; case MotionEvent.ACTION_MOVE:// 移動(dòng) // LogUtils.d("init moveY " + moveY); tempy1 = moveY; moveY = (int) event.getY(); speed = moveY - tempy1; // 判斷向上移動(dòng)還是向下移動(dòng) if (speed > 0) { isDown = true; } else { isDown = false; } logic(isDown);// 計(jì)算點(diǎn)的距離 // LogUtils.d("pointY = " + pointY + " moveY = " + moveY + " speed " // + (speed)); break; case MotionEvent.ACTION_UP: moveY = 0; mTempX = (int) event.getX(); mTempY = (int) event.getY(); if (Math.abs(mTempX - mDownX) > MAX_DISTANCE_FOR_CLICK || Math.abs(mTempY - mDownY) > MAX_DISTANCE_FOR_CLICK) { // 抬起的距離 和按下的距離太遠(yuǎn) 不形成點(diǎn)擊事件 // LogUtils.d("起的距離 和按下的距離太遠(yuǎn) 不形成點(diǎn)擊事件"); } else { isOnclick(mTempX, mTempY); } break; } invalidate();// 刷新界面 // 使系統(tǒng)響應(yīng)事件,返回true return true; } // 添加自定義點(diǎn)擊事件 private boolean isOnclick(int x, int y) { LogUtils.d("點(diǎn)擊了"); if (listener != null) { // 判斷是否點(diǎn)擊到星星上面 return isStarsOnclick(x, y, listener); } else { return false; } } private boolean isStarsOnclick(int x, int y, ScrollViewListener listener) { int x1; int y1; int x2; int y2; // LogUtils.d("點(diǎn)擊 X = " + x + " 點(diǎn)擊 Y = " + y + " 星星 X = " + pointsX[0] // + " 星星 y = " + pointsY[0]); for (int i = 0; i < 22; i++) { x1 = pointsX[i]; y1 = pointsY[i]; // LogUtils.d("比例 y 100 = " + (double) 100 / screenHeight); // LogUtils.d("比例 x 100 = " + (double) 100 / screenWidth); x2 = pointsX[i] + (int) (screenWidth * 0.09259259259259259); y2 = pointsY[i] + (int) (screenHeight * 0.052083333333333336); if (x > x1 && x < x2 && y > y1 && y < y2) { // LogUtils.d("點(diǎn)擊到了"); int current = getOnclickNo(i) + 1; listener.myOnclick(current); // LogUtils.d("點(diǎn)擊的第幾位 : " + current); return true; } } // LogUtils.d("沒有點(diǎn)擊到"); return false; } // 判斷是否到頂部了 private void isTop() { if (activityNumber >= 8 && bg1y > getHeight()) { // LogUtils.d("當(dāng)?shù)?張圖片的Y坐標(biāo)超出屏幕, 圖片向上的情況 activityNumber 加上的 =======到頂部= bg1y" // + activityNumber); bg1y = getHeight(); bg2y = bg1y - bmpBackGround1.getHeight(); speed = 0; speedStarsXY(); return; } else { speedStarsXY(); } } // 背景滾動(dòng)的邏輯函數(shù) public void logic(boolean isDown) { if (isDown) {// 手指向下 if (tempy1 != 0) { bg1y += speed; bg2y += speed; // LogUtils.d("isTop = " + isTop()); isTop(); } // //判斷是否到頂部了 // if (activityNumber >= 8 && bg1y > getHeight()) { // //LogUtils.d("當(dāng)?shù)?張圖片的Y坐標(biāo)超出屏幕, 圖片向上的情況 activityNumber 加上的 =======到頂部= bg1y" // + activityNumber); // bg1y = getHeight(); // bg2y = bg1y - bmpBackGround1.getHeight(); // return; // } // LogUtils.d("bg1y = " + bg1y + " bg2y = " + bg2y + // " bg1y - bmpBackGround1.getHeight() = " + (bg1y - // bmpBackGround1.getHeight()) + // " -Math.abs(bmpBackGround1.getHeight() - getHeight()) = " + // (-Math.abs(bmpBackGround1.getHeight() - getHeight()))); // 當(dāng)?shù)谝粡垐D片的Y坐標(biāo)超出屏幕, 手指向下的情況 // 立即將其坐標(biāo)設(shè)置到第二張圖的上方 if (bg1y > getHeight()) { bg1y = bg2y - bmpBackGround1.getHeight(); activityNumber += 1; // LogUtils.d("bg1y = " + bg1y + " getHeight = " + getHeight() + // " bmpBackGround1.getHeight() = " + // bmpBackGround1.getHeight() + " activityNumber 加上的 = " + // activityNumber); setStartsXYDown(0); // LogUtils.d("當(dāng)?shù)?張圖片的Y坐標(biāo)超出屏幕, 圖片向上的情況 activityNumber 加上的 = " // + activityNumber); } // 當(dāng)?shù)诙垐D片的Y坐標(biāo)超出屏幕,向下的情況 // 立即將其坐標(biāo)設(shè)置到第一張圖的上方 if (bg2y > getHeight()) { bg2y = bg1y - bmpBackGround1.getHeight(); activityNumber += 1; // LogUtils.d("當(dāng)?shù)?張圖片的Y坐標(biāo)超出屏幕, 圖片向上的情況 activityNumber 加上的 = " // + activityNumber); // LogUtils.d("bg1y = " + bg1y + " getHeight = " + getHeight() + // " bmpBackGround1.getHeight() = " + // bmpBackGround1.getHeight() + " activityNumber 加上的 = " + // activityNumber); setStartsXYDown(1); } } else { // 當(dāng)?shù)谝粡垐D片的Y坐標(biāo)超出屏幕, 手指向上的情況 // 立即將其坐標(biāo)設(shè)置到第二張圖的下方 if (tempy1 != 0) { bg1y += speed; bg2y += speed; // //判斷是否到底部 isBottom(); } // LogUtils.d("bg1y = " + bg2y + " bg2y = " + bg2y + // " bg1y - bmpBackGround1.getHeight() = " + (bg1y - // bmpBackGround1.getHeight()) + // " -Math.abs(bmpBackGround1.getHeight() - getHeight()) = " + // (-Math.abs(bmpBackGround1.getHeight() - getHeight()))); if (bg1y < -Math.abs(bmpBackGround1.getHeight() - getHeight())) { if (bg2y < bg1y) { activityNumber -= 1; setStartsXYUp(1); // LogUtils.d("當(dāng)?shù)?張圖片的Y坐標(biāo)超出屏幕, 圖片向下的情況 activityNumber 減去的 = " // + activityNumber); } bg2y = bg1y + bmpBackGround1.getHeight();// 換屏了 首尾相接 } if (bg2y < -Math.abs(bmpBackGround1.getHeight() - getHeight())) { if (bg1y < bg2y) {// 當(dāng)換圖的時(shí)候 給減一 activityNumber -= 1; setStartsXYUp(0); // LogUtils.d("當(dāng)?shù)诙垐D片的Y坐標(biāo)超出屏幕, 圖片向下的情況 activityNumber 減去的 = " // + activityNumber); } bg1y = bg2y + bmpBackGround1.getHeight(); } } } private void isBottom() { int treeHeight = bmpBackGround1.getHeight() - getHeight(); if (treeHeight < 0) { if (activityNumber <= 2 && bg1y < Math .abs(bmpBackGround1.getHeight() - getHeight())) {// 如果是一開始的 // 到底部時(shí) // 不能滑動(dòng) // 并且重置 // 坐標(biāo)點(diǎn) activityNumber = 2; bg1y = Math.abs(bmpBackGround1.getHeight() - getHeight()); // 第二張背景圖緊接在第一張背景的上方 // 直接連接不和諧,為了讓視覺看不出是兩張圖連接而修正的位置 bg2y = bg1y - bmpBackGround1.getHeight(); initStartsXY(); return; } else { speedStarsXY(); // LogUtils.d("pointy speedStarsXY 11之后 = " + pointsY[11]); } } else { if (activityNumber <= 2 && bg1y < -Math.abs(bmpBackGround1.getHeight() - getHeight())) {// 如果是一開始的 到底部時(shí) 不能滑動(dòng) 并且重置 坐標(biāo)點(diǎn) activityNumber = 2; bg1y = -Math.abs(bmpBackGround1.getHeight() - getHeight()); // 第二張背景圖緊接在第一張背景的上方 // +101的原因:雖然兩張背景圖無縫隙連接但是因?yàn)閳D片資源頭尾 // 直接連接不和諧,為了讓視覺看不出是兩張圖連接而修正的位置 bg2y = bg1y - bmpBackGround1.getHeight(); initStartsXY(); return; } else { speedStarsXY(); // LogUtils.d("pointy speedStarsXY 11之后 = " + pointsY[11]); } } } private void initBgView() { int treeHeight = bmpBackGround1.getHeight() - getHeight(); if (treeHeight < 0) { activityNumber = 2; bg1y = Math.abs(bmpBackGround1.getHeight() - getHeight()); // 第二張背景圖緊接在第一張背景的上方 // 直接連接不和諧,為了讓視覺看不出是兩張圖連接而修正的位置 bg2y = bg1y - bmpBackGround1.getHeight(); initStartsXY(); return; } else { activityNumber = 2; bg1y = -Math.abs(bmpBackGround1.getHeight() - getHeight()); // 第二張背景圖緊接在第一張背景的上方 bg2y = bg1y - bmpBackGround1.getHeight(); initStartsXY(); return; } } }
源碼下載:Android仿開心消消樂游戲
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android游戲源碼分享之2048
- Unity3D游戲引擎實(shí)現(xiàn)在Android中打開WebView的實(shí)例
- Android游戲開發(fā)實(shí)踐之人物移動(dòng)地圖的平滑滾動(dòng)處理
- Android 游戲開發(fā)之Canvas畫布的介紹及方法
- Android游戲開發(fā)之碰撞檢測(cè)(矩形碰撞、圓形碰撞、像素碰撞)
- Android五子棋游戲程序完整實(shí)例分析
- 以一個(gè)著色游戲展開講解Android中區(qū)域圖像填色的方法
- Android高仿2048小游戲?qū)崿F(xiàn)代碼
- Android開心消消樂代碼實(shí)例詳解
- Android 2d游戲開發(fā)之貪吃蛇基于surfaceview
相關(guān)文章
TextView長(zhǎng)按復(fù)制的實(shí)現(xiàn)方法(總結(jié))
下面小編就為大家?guī)硪黄猅extView長(zhǎng)按復(fù)制的實(shí)現(xiàn)方法(總結(jié))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04RecyclerView仿應(yīng)用列表實(shí)現(xiàn)網(wǎng)格布局
這篇文章主要為大家詳細(xì)介紹了RecyclerView仿應(yīng)用列表實(shí)現(xiàn)網(wǎng)格布局,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Android實(shí)現(xiàn)聲音采集回聲與回聲消除
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)聲音采集回聲與回聲消除,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Android DynamicGrid實(shí)現(xiàn)拖曳交換位置功能
這篇文章主要為大家詳細(xì)介紹了Android DynamicGrid實(shí)現(xiàn)拖曳交換位置功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Mono for Android 實(shí)現(xiàn)高效的導(dǎo)航(Effective Navigation)
Android 4.0 系統(tǒng)定義了一系列的高效導(dǎo)航方式 (Effective Navigation), 主要包括標(biāo)簽、下拉列表、以及向上和返回等, 本文介紹如何用 Mono for Android 實(shí)現(xiàn)這些的導(dǎo)航方式2012-12-12淺談 Android 7.0 多窗口分屏模式的實(shí)現(xiàn)
這篇文章主要介紹了淺談 Android 7.0 多窗口分屏模式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Android開發(fā)之文本內(nèi)容自動(dòng)朗讀功能實(shí)現(xiàn)方法
這篇文章主要介紹了Android開發(fā)之文本內(nèi)容自動(dòng)朗讀功能實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android自動(dòng)朗讀TTS功能的操作步驟、相關(guān)函數(shù)使用方法與注意事項(xiàng),需要的朋友可以參考下2017-09-09Android 全局Dialog的簡(jiǎn)單實(shí)現(xiàn)方法
本篇文章主要介紹了Android 全局Dialog的簡(jiǎn)單實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02Genymotion模擬器常見問題整理與相應(yīng)解決方法
為什么說是常見問題整合呢,因?yàn)樾【幬揖褪荊enymotion模板器最悲劇的使用者,該見過的問題,我基本都見過了,在此總結(jié)出這血的教訓(xùn),望大家不要重蹈覆轍2018-03-03