最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Android自定義控件實(shí)現(xiàn)刮刮樂效果

 更新時間:2015年12月23日 11:16:20   作者:天羽飛龍  
這篇文章主要介紹了基于Android自定義控件實(shí)現(xiàn)刮刮樂效果 的相關(guān)資料,需要的朋友可以參考下

 只是簡單的實(shí)現(xiàn)了效果,界面沒怎么做優(yōu)化,不過那都是次要的啦?。∠嘈糯蠹叶计炔患按南肟葱Ч麍D了吧,

其中主要的彩票視圖類和橡皮擦類都是通過代碼的方式構(gòu)建視圖,布局文件就一個主activity_main

上代碼?。?br />

主activity:

package com.guaguale;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.RelativeLayout;
/**
 * 主activity
 * 
 * @author HaoZai
 * 
 */
public class MainActivity extends Activity {
RelativeLayout container;
Button btn;
ErinieShow erinieShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
container = (RelativeLayout) findViewById(R.id.container);
btn = (Button) findViewById(R.id.enterbtn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showEnrie();
}
});
}
private void showEnrie() {
// TODO Auto-generated method stub
// 移除所有子元素
container.removeAllViews();
// 產(chǎn)生一個彩票
int level = getLevel();
erinieShow = new ErinieShow(this, level);
container.addView(erinieShow, new LayoutParams(-2, -2));
}
/**
 * 獲取獎勵等級
 * 
 * @return
 */
private int getLevel() {
// TODO Auto-generated method stub
double d = Math.random() * 100;
if (d < 50) {
return 3;
}
if (d < 90) {
return 2;
}
return 1;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
 
因?yàn)椴势币晥D相對復(fù)雜,所以通過自定義控件的方式,構(gòu)造了一個彩票視圖
 
package com.guaguale;
import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
/**
 * 彩票視圖類
 * 
 * @author HaoZai
 * 
 */
public class ErinieShow extends RelativeLayout {
int level;
Context mContext;
RelativeLayout rubberBG;// 最底層獎勵等級
RubberShow mRubberShow;// 橡皮擦
Button mButton;
int rubberBGID = 10001;
int mButtonID = 10002;
public ErinieShow(Context context, int level) {
super(context);
// TODO Auto-generated constructor stub
this.mContext = context;
this.level = level;
getElement();// 得到子元素
setElementLP();// 設(shè)置布局參數(shù)
// 初始化彩票了
setElementStyle();
// 設(shè)置橡皮檫了
setElement();
}
private void setElement() {
// 第一步在彩票上面畫一個圖層
mRubberShow.beginRubber(Color.parseColor("#d3d3d3"), 30, 10);
}
private void setElementStyle() {
switch (level) {
case 1:
rubberBG.setBackgroundResource(R.drawable.ic_launcher);
break;
case 2:
rubberBG.setBackgroundResource(R.drawable.ic_launcher);
break;
case 3:
rubberBG.setBackgroundResource(R.drawable.ic_launcher);
break;
default:
break;
}
}
/**
 * 給布局的子元素設(shè)置布局參數(shù)
 */
private void setElementLP() {
// TODO Auto-generated method stub
RelativeLayout.LayoutParams rubber_bg_lp = new RelativeLayout.LayoutParams(
350, 80);
rubberBG.setLayoutParams(rubber_bg_lp);
mRubberShow.setLayoutParams(rubber_bg_lp);
// rubber_bg_lp正下方
RelativeLayout.LayoutParams rubber_btn_lp = new RelativeLayout.LayoutParams(
-2, -2);
rubber_btn_lp.addRule(RelativeLayout.CENTER_HORIZONTAL);
rubber_btn_lp.addRule(RelativeLayout.BELOW, rubberBGID);
mButton.setLayoutParams(rubber_btn_lp);
mButton.setClickable(false);
}
/**
 * 獲取布局的子元素
 */
private void getElement() {
// TODO Auto-generated method stub
rubberBG = new RelativeLayout(mContext);// 得到彩票
mRubberShow = new RubberShow(mContext, level);// 得到橡皮擦
mButton = new Button(mContext);
rubberBG.setId(rubberBGID);
mButton.setId(mButtonID);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
rubberBG.addView(mRubberShow);
addView(rubberBG);
addView(mButton);
}
}
 
橡皮檫類,用于將中獎信息上面的臨時畫布去掉
 
package com.guaguale;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Bitmap.Config;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
/**
 * 橡皮擦類
 * 
 * @author HaoZai
 * 
 */
public class RubberShow extends View {
private float TOUCH_TO_ERANCE;// 填充的最小距離,這個值越小畫出來的曲線越柔和
private Bitmap bitmap;
private Canvas canvas;// 臨時畫布
private Paint paint;// 畫筆
private Path mPath;// 鼠標(biāo)的運(yùn)行路徑
private float mx, my;// 坐標(biāo)
private boolean isDraw = false;
public RubberShow(Context context, int level) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
protected void onDraw(Canvas mCanvas) {
// TODO Auto-generated method stub
super.onDraw(mCanvas);
if (isDraw) {
Log.i("tag", "111");
mCanvas.drawPath(mPath, paint);
mCanvas.drawBitmap(bitmap, 0, 0, null);// 從起點(diǎn)開始畫
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isDraw) {
return true;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touchDown(event.getX(), event.getY());
invalidate();// 刷新
break;
case MotionEvent.ACTION_MOVE:
touchMove(event.getX(), event.getY());
invalidate();// 刷新
break;
case MotionEvent.ACTION_UP:
touchUp(event.getX(), event.getY());
invalidate();// 刷新
break;
default:
break;
}
return true;
}
private void touchUp(float x, float y) {
// 畫出路線
mPath.lineTo(x, y);
canvas.drawPath(mPath, paint);
mPath.reset();
}
private void touchMove(float x, float y) {
float dx = Math.abs(x - mx);
float dy = Math.abs(y - my);
// 兩點(diǎn)之間的距離大于TOUCH_TO_ERANCE,就生成貝瑟爾曲線
if (dx >= TOUCH_TO_ERANCE || dy >= TOUCH_TO_ERANCE) {
// 用貝瑟爾實(shí)現(xiàn)平滑的曲線
// mPath.lineTo(dx, dy);
mPath.quadTo(mx, my, (x + mx) / 2, (y + my) / 2);
mx = x;
my = y;
}
}
private void touchDown(float x, float y) {
mPath.reset();// 重置路徑
mPath.moveTo(x, y);
mx = x;
my = y;
}
/**
 * @param bgColor
 *   覆蓋的背景顏色
 * @param paintStrokeWidth
 *   橡皮擦寬度
 * @param touchToLerance
 *   填充距離
 */
public void beginRubber(final int bgColor, final int paintStrokeWidth,
float touchToLerance) {
TOUCH_TO_ERANCE = touchToLerance;
paint = new Paint();
// 畫筆劃過的痕跡變?yōu)橥该?
paint.setColor(Color.BLACK);// 此處不能為透明
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
paint.setAntiAlias(true);// 變?yōu)楣饣?
paint.setStyle(Style.STROKE);// 空心和實(shí)心
paint.setStrokeJoin(Paint.Join.ROUND);// 前面圓角
paint.setStrokeCap(Paint.Cap.ROUND);// 后圓角
paint.setStrokeWidth(paintStrokeWidth);// 畫筆寬度
// 覆蓋
LayoutParams layoutParams = getLayoutParams();
int height = layoutParams.height;
int width = layoutParams.width;
// if(layoutParams.height ==LayoutParams.MATCH_PARENT){
//
// }else{
//
// }
// 記錄痕跡
mPath = new Path();
bitmap = Bitmap.createBitmap(width, height, Config.ARGB_4444);// 4444占內(nèi)存更少
canvas = new Canvas(bitmap);
canvas.drawColor(bgColor);
isDraw = true;
}
}

以上代碼附有注釋,有哪里不明白的地方歡迎大家提出寶貴意見,謝謝大家一直以來對腳本之家網(wǎng)站的支持。

相關(guān)文章

  • Android開發(fā)實(shí)現(xiàn)的計(jì)時器功能示例

    Android開發(fā)實(shí)現(xiàn)的計(jì)時器功能示例

    這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)的計(jì)時器功能,涉及Android開發(fā)中的計(jì)時器相關(guān)組件布局、調(diào)用、事件響應(yīng)等相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • Android 異步加載圖片的實(shí)例代碼

    Android 異步加載圖片的實(shí)例代碼

    異步加載圖片主要是利用多線程進(jìn)行下載、圖片弱引用緩存和Handler操作UI進(jìn)行實(shí)現(xiàn)的。
    2013-05-05
  • 簡單實(shí)現(xiàn)Android放大鏡效果

    簡單實(shí)現(xiàn)Android放大鏡效果

    這篇文章主要教大家簡單實(shí)現(xiàn)Android放大鏡效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android自動化獲取卡頓信息的實(shí)現(xiàn)方法

    Android自動化獲取卡頓信息的實(shí)現(xiàn)方法

    自動化獲取卡頓信息就像給App裝  “行車記錄儀”  —— 實(shí)時記錄主線程的“駕駛狀態(tài)”,一旦發(fā)現(xiàn)“急剎車”(卡頓),立刻保存現(xiàn)場(堆棧),事后回看錄像(日志)精準(zhǔn)定位問題,本文給大家介紹了Android自動化獲取卡頓信息的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2025-02-02
  • 詳解Android提交數(shù)據(jù)到服務(wù)器的兩種方式四種方法

    詳解Android提交數(shù)據(jù)到服務(wù)器的兩種方式四種方法

    本篇文章主要介紹了Android提交數(shù)據(jù)到服務(wù)器的兩種方式四種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • Android開發(fā)解決字符對齊問題方法

    Android開發(fā)解決字符對齊問題方法

    這篇文章主要為大家介紹了Android開發(fā)解決字符對齊問題方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Android事件分發(fā)機(jī)制的詳解

    Android事件分發(fā)機(jī)制的詳解

    這篇文章主要介紹了Android事件分發(fā)機(jī)制的詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握Android事件分發(fā)機(jī)制,需要的朋友可以參考下
    2017-09-09
  • Android編程連接MongoDB及增刪改查等基本操作示例

    Android編程連接MongoDB及增刪改查等基本操作示例

    這篇文章主要介紹了Android編程連接MongoDB及增刪改查等基本操作,簡單介紹了MongoDB功能、概念、使用方法及Android操作MongoDB數(shù)據(jù)庫的基本技巧,需要的朋友可以參考下
    2017-07-07
  • Android如何通過命令行操作Sqlite3數(shù)據(jù)庫的方法

    Android如何通過命令行操作Sqlite3數(shù)據(jù)庫的方法

    這篇文章主要介紹了Android如何通過命令行操作Sqlite3數(shù)據(jù)庫的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Android中View自定義組合控件的基本編寫方法

    Android中View自定義組合控件的基本編寫方法

    這篇文章主要介紹了Android中View自定義組合控件的基本編寫方法,可以在布局的時候更加隨意地繼承,需要的朋友可以參考下
    2016-04-04

最新評論

阳城县| 浏阳市| 大港区| 白河县| 北宁市| 蓬安县| 仁怀市| 武强县| 祁连县| 合水县| 江安县| 广元市| 武隆县| 方城县| 高淳县| 长治市| 双柏县| 谢通门县| 定襄县| 库尔勒市| 伊吾县| 梁平县| 新泰市| 辽宁省| 龙胜| 英山县| 通榆县| 阿坝| 靖西县| 仪征市| 墨脱县| 农安县| 蒙阴县| 柏乡县| 新乡县| 板桥市| 霍邱县| 石渠县| 洪泽县| 威信县| 长宁区|