android drawable转bitmap_挖穿Android第四十五天

238f6a59fa8393da7ff1869da7de9ee1.png

1.模拟美图秀秀的修改图形

1.反编译mtxx.apk,得到so文件,放到自己工程下的libs目录下;2.反编译mtxx.apk,查看JNI的java代码.3.按照mtxx.apk中的包名在自己工程中创建包名,创建JNI类,把2中JNI中的代码拷贝过来;4.在调用JNI中的修改图形的方法,修改图形的数组. public void click(View v){ //1.得到原图 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.after2); int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()]; // 2.得到原图的颜色对应的数组 // 参1:图形颜色对应的数组 // 参2:开始写颜色数据的索引位置 bitmap.getPixels(pixels , 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); // 3.调用so的方法修改数组中的数据 JNI jni = new JNI(); // 参1:pixels 需要修改的数组 jni.StyleLomoC(pixels, bitmap.getWidth(), bitmap.getHeight()); // 4.使用修改后的数组创建一个新的图片 Bitmap newBitmap = Bitmap.createBitmap(pixels, bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); // 5.显示图片 iv.setImageBitmap(newBitmap);}

2.锅炉压力表

1.在Android界面上显示柱状的图形:柱的高低与压力值有关柱的颜色与压力的区间有关系MainActivity.java: public class MainActivity extends Activity { private PresureView view; private int presure; private Timer timer; private TimerTask task; static { // 加载动态库 System.loadLibrary("PresureDemo"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); timer = new Timer(); task = new TimerTask() { @Override public void run() { // 调用C代码得到压力值 presure = getPresure(); runOnUiThread(new Runnable() { @Override public void run() { if (presure <= 200) { view = new PresureView(MainActivity.this, presure); setContentView(view); } else { TextView view = new TextView( getApplicationContext()); view.setText("哥哥,赶快跑,锅炉要爆炸了!!!!!!!!"); view.setTextColor(Color.RED); view.setTextSize(25); setContentView(view); // 爆炸后停止更新柱状图标 timer.cancel(); task.cancel(); timer = null; task = null; } } }); } }; timer.scheduleAtFixedRate(task, 500, 1000); } public native int getPresure(); }

PresureView.java:

 public class PresureView extends View { private Paint paint; private int mPresure; public PresureView(Context context,int presure) { super(context); // 接收传过来的压力值 mPresure = presure; paint = new Paint(); } /** * 界面一打开就调用这个方法绘制图形 */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(0< mPresure && mPresure <= 180){ paint.setColor(Color.GREEN); }else if(mPresure <= 250){ paint.setColor(Color.YELLOW); }else if(mPresure < 280){ paint.setColor(Color.RED); }else { // 锅炉要爆炸了 } canvas.drawRect(20, 300 - mPresure, 40, 300, paint); } }2.在c代码中得到压力:#include #include #include "cn_itcast_presuredemo_MainActivity.h"#include #define LOG_TAG "System.out"#define LOGE(...)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)#define LOGI(...)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)int getPresure(){ // 得到一个随机的数字 int presure = rand(); return presure % 300;}JNIEXPORT jint JNICALL Java_cn_itcast_presuredemo_MainActivity_getPresure (JNIEnv * env, jobject obj){ int presure = getPresure(); return presure;}

3.卸载应用打开浏览器

#include #include #include "cn_itcast_uninstallappdemo_MainActivity.h"JNIEXPORT void JNICALL Java_cn_itcast_uninstallappdemo_MainActivity_callUninstallApp( JNIEnv * env, jobject obj) { int isStop = 1; // 使用fork函数分裂一个进程 int result = fork(); if (result > 0) { // 说明当前程序是运行在父进程中的 } else if (result == 0) { // 说明当前程序是运行在子进程中的 while (isStop) { // 睡眠1秒 sleep(1); // FILE *fopen(const char *, const char *); FILE* file = fopen("/data/data/cn.itcast.uninstallappdemo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值