Android 移除无用的resource文件shrinkResources true以后保留指定图片或文件布局

1.设置开启混淆和移除无用资源

解决办法:

1.把项目切换到project下,在res中创建raw文件夹,再创建keep.xml

2.keep.编写

代码-->

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
           tools:keep="@drawable/ic_launcher"/>

3.拓展

如果想保留布局文件  直接把@drawable换成@layout 再把布局文件的名称替换就可以了,另外@drawable/ic_*表示以ic_开头的图片都会被忽略移除,就是都会被保留.保留多个用逗号隔开就行.

例子:

<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@layout /activity_main,@layout/activity_*,@drawable/ic_launcher,@drawable/ic_*"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的贪吃蛇小游戏的实现,以下是实现步骤: 1. 创建游戏布局文件布局文件中,我们需要定义一个游戏区域,一个得分区域和一个游戏结束的提示信息。 ```xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 游戏区域 --> <FrameLayout android:id="@+id/game_area" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/score_area"> <!-- 蛇 --> <ImageView android:id="@+id/snake_head" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/snake_head" /> <!-- 食物 --> <ImageView android:id="@+id/food" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/food" /> </FrameLayout> <!-- 得分区域 --> <TextView android:id="@+id/tv_score" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:gravity="center" android:textColor="@android:color/white" android:textSize="24sp" /> <!-- 游戏结束提示 --> <TextView android:id="@+id/tv_game_over" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:text="Game Over" android:textColor="@android:color/white" android:textSize="36sp" android:visibility="gone" /> </RelativeLayout> ``` 2. 创建游戏控制类 在游戏控制类中,我们需要定义蛇的移动、食物的随机生成和碰撞检测等逻辑。 ```java public class SnakeGameController implements View.OnClickListener { private static final int GAME_AREA_SIZE = 600; // 游戏区域大小 private static final int SNAKE_SIZE = 60; // 蛇的大小 private static final int FOOD_SIZE = 60; // 食物的大小 private static final int MOVE_STEP = 60; // 蛇每次移动的距离 private static final int MOVE_INTERVAL = 500; // 蛇每次移动的时间间隔 private ImageView mSnakeHead; // 蛇头 private ImageView mFood; // 食物 private TextView mTvScore; // 得分区域 private TextView mTvGameOver; // 游戏结束提示 private List<ImageView> mSnakeBody = new ArrayList<>(); // 蛇身体 private int mScore = 0; // 得分 private boolean mIsGameOver = false; // 游戏是否结束 private Handler mHandler = new Handler(); // 用于更新UI private Runnable mMoveRunnable = new Runnable() { @Override public void run() { moveSnake(); mHandler.postDelayed(this, MOVE_INTERVAL); } }; public SnakeGameController(ImageView snakeHead, ImageView food, TextView tvScore, TextView tvGameOver) { mSnakeHead = snakeHead; mFood = food; mTvScore = tvScore; mTvGameOver = tvGameOver; // 添加蛇头到蛇身体列表 mSnakeBody.add(mSnakeHead); // 设置食物的位置 setFoodPosition(); // 设置点击事件 mSnakeHead.setOnClickListener(this); } // 移动蛇 private void moveSnake() { // 获取蛇头的位置 int x = (int) mSnakeHead.getX(); int y = (int) mSnakeHead.getY(); // 根据蛇头的方向计算新的位置 switch (mSnakeHead.getRotation()) { case 0: y -= MOVE_STEP; break; case 90: x += MOVE_STEP; break; case 180: y += MOVE_STEP; break; case 270: x -= MOVE_STEP; break; } // 判断蛇是否超出游戏区域 if (x < 0 || x > GAME_AREA_SIZE - SNAKE_SIZE || y < 0 || y > GAME_AREA_SIZE - SNAKE_SIZE) { gameOver(); return; } // 判断蛇是否碰到自己 for (int i = 1; i < mSnakeBody.size(); i++) { ImageView body = mSnakeBody.get(i); if (x == body.getX() && y == body.getY()) { gameOver(); return; } } // 判断蛇是否碰到食物 if (x == mFood.getX() && y == mFood.getY()) { // 增加得分 mScore++; mTvScore.setText("Score: " + mScore); // 在蛇尾添加一个身体 ImageView body = new ImageView(mSnakeHead.getContext()); body.setImageResource(R.drawable.snake_body); body.setLayoutParams(new FrameLayout.LayoutParams(SNAKE_SIZE, SNAKE_SIZE)); body.setX(mSnakeHead.getX()); body.setY(mSnakeHead.getY()); mSnakeBody.add(body); ((FrameLayout) mSnakeHead.getParent()).addView(body); // 设置新的食物位置 setFoodPosition(); } // 移动蛇头 mSnakeHead.setX(x); mSnakeHead.setY(y); // 移动蛇身体 for (int i = mSnakeBody.size() - 1; i > 0; i--) { ImageView body1 = mSnakeBody.get(i); ImageView body2 = mSnakeBody.get(i - 1); body1.setX(body2.getX()); body1.setY(body2.getY()); } } // 设置食物的位置 private void setFoodPosition() { // 随机生成食物的位置 int x = new Random().nextInt(GAME_AREA_SIZE / FOOD_SIZE) * FOOD_SIZE; int y = new Random().nextInt(GAME_AREA_SIZE / FOOD_SIZE) * FOOD_SIZE; mFood.setX(x); mFood.setY(y); } // 游戏结束 private void gameOver() { mIsGameOver = true; mHandler.removeCallbacks(mMoveRunnable); mTvGameOver.setVisibility(View.VISIBLE); } // 开始游戏 public void startGame() { mIsGameOver = false; mScore = 0; mTvScore.setText("Score: " + mScore); mTvGameOver.setVisibility(View.GONE); // 设置蛇头的初始位置和方向 mSnakeHead.setX(GAME_AREA_SIZE / 2 - SNAKE_SIZE / 2); mSnakeHead.setY(GAME_AREA_SIZE - SNAKE_SIZE); mSnakeHead.setRotation(180); // 移除蛇身体 for (ImageView body : mSnakeBody) { ((FrameLayout) mSnakeHead.getParent()).removeView(body); } mSnakeBody.clear(); mSnakeBody.add(mSnakeHead); // 设置食物的位置 setFoodPosition(); // 开始移动蛇 mHandler.postDelayed(mMoveRunnable, MOVE_INTERVAL); } @Override public void onClick(View v) { // 切换蛇头的方向 if (!mIsGameOver) { mSnakeHead.setRotation((mSnakeHead.getRotation() + 90) % 360); } } } ``` 3. 在Activity中使用游戏控制类 在Activity中,我们需要获取布局文件中的控件,并创建游戏控制类的实例。同时,在点击开始游戏按钮时,调用游戏控制类的startGame方法。 ```java public class SnakeGameActivity extends AppCompatActivity implements View.OnClickListener { private SnakeGameController mGameController; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_snake_game); ImageView snakeHead = findViewById(R.id.snake_head); ImageView food = findViewById(R.id.food); TextView tvScore = findViewById(R.id.tv_score); TextView tvGameOver = findViewById(R.id.tv_game_over); findViewById(R.id.btn_start_game).setOnClickListener(this); mGameController = new SnakeGameController(snakeHead, food, tvScore, tvGameOver); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_start_game: mGameController.startGame(); break; } } } ``` 至此,一个简单的贪吃蛇小游戏就完成了。您可以根据需要对游戏进行扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值