GVKun编程网logo

类型不匹配:无法从ByteMatrix转换为BitMatrix(类型不匹配不能从int转化为boolean)

17

在这篇文章中,我们将为您详细介绍类型不匹配:无法从ByteMatrix转换为BitMatrix的内容,并且讨论关于类型不匹配不能从int转化为boolean的相关问题。此外,我们还会涉及一些关于And

在这篇文章中,我们将为您详细介绍类型不匹配:无法从ByteMatrix转换为BitMatrix的内容,并且讨论关于类型不匹配不能从int转化为boolean的相关问题。此外,我们还会涉及一些关于Android ZXING通过BitMatrix编码qr->存储到byte []->插入数据库、android – 类型不匹配:无法将void转换为toast、android – 类型类型不匹配:无法从RegisterFragment转换为Fragment、Android 图片处理(Matrix,ColorMatrix)的知识,以帮助您更全面地了解这个主题。

本文目录一览:

类型不匹配:无法从ByteMatrix转换为BitMatrix(类型不匹配不能从int转化为boolean)

类型不匹配:无法从ByteMatrix转换为BitMatrix(类型不匹配不能从int转化为boolean)

我正在使用ZXING库在JAVA中创建QR码生成器程序。该程序是

import com.google.zxing.BarcodeFormat;import com.google.zxing.WriterException;import com.google.zxing.client.j2se.MatrixToImageWriter;import com.google.zxing.common.BitMatrix;import com.google.zxing.qrcode.QRCodeWriter;import java.io.IOException;import java.nio.file.FileSystems;import java.nio.file.Path;public class QR_Gen {    private static final String QR_CODE_IMAGE_PATH = "./MyCode.png";    private static void generateQRCodeImage(String text, int width, int height, String filePath) throws WriterException, IOException {        QRCodeWriter qrCodeWriter = new QRCodeWriter();        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);        Path path = FileSystems.getDefault().getPath(filePath);        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);    }    public static void main(String[] args) {        try {            generateQRCodeImage("This is my first QR Code", 350, 350, QR_CODE_IMAGE_PATH);            System.out.println("QR Code generated successfully");        } catch (WriterException e) {            System.out.println("Could not generate QR Code, WriterException :: " + e.getMessage());        } catch (IOException e) {            System.out.println("Could not generate QR Code, IOException :: " + e.getMessage());        }    }}

编译该程序时,出现类型不匹配错误,

Type mismatch: cannot convert from ByteMatrix to BitMatrix

在这条线

BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);

请帮忙!!!

答案1

小编典典

我自己从未使用过该库,但是阅读错误消息时,我会假设您必须要以字节为单位存储字节的问题。问题将是一个字节由多个位组成,因此您不能仅通过一位表示一个字节。

将编码数据存储到ByteMatrix中,然后阅读以下内容:

  • 使用zxing进行QR码编码和解码

完成事情。

Android ZXING通过BitMatrix编码qr->存储到byte []->插入数据库

Android ZXING通过BitMatrix编码qr->存储到byte []->插入数据库

周末我一直在与zxing玩耍,遇到了一个我无法解决的问题.我正在使用QR Code encoding and decoding using zxing处的工作Java代码示例,并且对将生成的BitMatrix(用于存放qr代码的位)转换为byte []感兴趣,以便可以将图像存储在sql lite blob字段中(然后绘制条码).有谁知道这是否可能.我不确定从提供的编码解决方案出发.我已经在寻找http://zxing.org/w/docs/javadoc/com/google/zxing/client/j2se/MatrixToImageWriter.html的解决方案,但是还没有找到解决我的问题的方法(我想可能是通过MatrixToImageWriter完成的.

任何帮助是极大的赞赏!

干杯!

解决方法:

BitMatrix有几种获取其内容的方法,例如get()逐点获取或getRow()一次以BitArray的形式提供给您一行.您可以获取所需的内容,然后随心所欲.

android – 类型不匹配:无法将void转换为toast

android – 类型不匹配:无法将void转换为toast

我在我的主要活动中有一个方法是void返回类型.如果我在方法中创建一个Toast,它会显示错误“类型不匹配:无法将void转换为toast”.任何人都可以解释什么是问题,并帮助我解决方案?

public class HelloList<View> extends ListActivity  {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setlistadapter(new ArrayAdapter<String>(this, R.layout.list_item, COUNTRIES));
 ListView lv=getListView();
      lv.setTextFilterEnabled(true);
      lv.setonItemClickListener(new OnItemClickListener(){ 
            @Override

            public void onItemClick(AdapterView<?> arg0,android.view.View arg1, int arg2, long arg3) {
                // Todo Auto-generated method stub 
            //  Toast.makeText(getApplicationContext(), ((TextView) arg1).getText(),Toast.LENGTH_SHORT).show();
                System.out.println(arg2);
                String s="position is "+arg2;
                Toast.makeText(getApplicationContext(),s,Toast.LENGTH_SHORT).show();
            }

          });
      registerForContextMenu(lv);
      /*int i=lv.getCheckedItemPosition();
          Toast.makeText(getApplicationContext(),,Toast.LENGTH_SHORT).show();*/
    }
    public void onCreateContextMenu(ContextMenu menu, android.view.View v,
                                    ContextMenuInfo menuInfo) {
      super.onCreateContextMenu(menu, v, menuInfo);
      MenuInflater inflater = getMenuInflater();
      inflater.inflate(0x7f030000, menu);
    }

    public boolean onContextItemSelected(MenuItem item) {
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
      switch (item.getItemId()) {
      case 0x7f030000:
        editNote(info.id);
        return true;

      default:
        return super.onContextItemSelected(item);
      }
    }

   public void editNote(long id) {
    Toast m=Toast.makeText(this, "asdasd", 3);
    m.show();

    }

解决方法:

问题是您可以为变量分配方法.如果要直接显示,吐司应如下所示:

Toast.makeText(context, text, duration).show();

或者在你的情况下:

Toast.makeText(this, "sadasd", 2).show();

如果要将Toast存储在变量中然后显示它,则必须这样做:

Toast toast = Toast.makeText(context, text, duration);

toast.show();

或者在您的具体情况中:

Toast toast = Toast.makeText(this, "sadasd", 2);
toast.show();

在旁注:最好在Toast中使用常量LENGHT_SHORT和LENGTH_LONG来定义持续时间而不是2.特别是如果2在这里似乎不是有效值.详见此处:http://developer.android.com/reference/android/widget/Toast.html

然后它看起来像这样:

Toast.makeText(this, "sadasd", Toast.LENGTH_LONG).show();

android – 类型类型不匹配:无法从RegisterFragment转换为Fragment

android – 类型类型不匹配:无法从RegisterFragment转换为Fragment

这是我的代码,问题发生在Switch Case …. plz帮助

package com.example.atg.adapter;

import com.example.atg.LoginFragment;
import com.example.atg.RegisterFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;

public class TabsPagerAdapter extends FragmentStatePagerAdapter {
    public TabsPagerAdapter(FragmentManager fm) {
        super(fm);
        // Todo Auto-generated constructor stub
    }

    @Override
    public Fragment getItem(int i) {
        switch (i) {
        case 0:
            //Fragement for Android Tab
            return new LoginFragment();
        case 1:
           //Fragment for Ios Tab
            return new RegisterFragment();
        }
        return null;

    }

    @Override
    public int getCount() {
        // Todo Auto-generated method stub
        return 2; //No of Tabs
    }


    }

RegisterFragment类

package com.example.atg;
    import android.app.Activity;
    import android.app.Fragment;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.content.Intent;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    import com.example.atg.library.DatabaseHandler;
    import com.example.atg.library.UserFunctions;
    import org.json.JSONException;
    import org.json.JSONObject;
    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;

public class RegisterFragment extends Fragment {

/**
     *  JSON Response node names.
     **/


    private static String KEY_SUCCESS = "success";
    private static String KEY_UID = "uid";
    private static String KEY_FirsTNAME = "fname";
    private static String KEY_LASTNAME = "lname";
    private static String KEY_USERNAME = "uname";
    private static String KEY_EMAIL = "email";
    private static String KEY_CREATED_AT = "created_at";
    private static String KEY_ERROR = "error";

    /**
     * Defining layout items.
     **/

    EditText inputFirstName;
    EditText inputLastName;
    EditText inputUsername;
    EditText inputEmail;
    EditText inputPassword;
    Button btnRegister;
    TextView registerErrorMsg;


    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setContentView(R.layout.register);

    /**
     * Defining all layout items
     **/
        inputFirstName = (EditText) findViewById1(R.id.fname);
        inputLastName = (EditText) findViewById1(R.id.lname);
        inputUsername = (EditText) findViewById1(R.id.uname);
        inputEmail = (EditText) findViewById1(R.id.email);
        inputPassword = (EditText) findViewById1(R.id.pword);
        btnRegister = (Button) findViewById(R.id.register);
        registerErrorMsg = (TextView) findViewById(R.id.register_error);



/**
 * Button which Switches back to the login screen on clicked
 **/

        Button login = (Button) findViewById(R.id.bktologin);

        login.setonClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent myIntent = new Intent(view.getContext(),Login.class);
                startActivityForResult(myIntent,0);
            }



        });

        /**
         * Register Button click event.
         * A Toast is set to alert when the fields are empty.
         * Another toast is set to alert Username must be 5 characters.
         **/

        btnRegister.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (  ( !inputUsername.getText().toString().equals("")) && ( !inputPassword.getText().toString().equals("")) && ( !inputFirstName.getText().toString().equals("")) && ( !inputLastName.getText().toString().equals("")) && ( !inputEmail.getText().toString().equals("")) )
                {
                    if ( inputUsername.getText().toString().length() > 4 ){
                    NetAsync(view);

                    }
                    else
                    {
                        Toast.makeText(getApplicationContext(),"Username should be minimum 5 characters",Toast.LENGTH_SHORT).show();
                    }
                }
                else
                {
                    Toast.makeText(getApplicationContext(),"One or more fields are empty",Toast.LENGTH_SHORT).show();
                }
            }
        });
       }
    protected Context getApplicationContext() {
        // Todo Auto-generated method stub
        return null;
    }
    private EditText findViewById1(int fname) {
        // Todo Auto-generated method stub
        return null;
    }

    private Button findViewById(int register){
        return null;
    }
    private void setContentView(int register) {
        // Todo Auto-generated method stub

    }
    /**
     * Async Task to check whether internet connection is working
     **/

    private class NetCheck extends AsyncTask<String,String,Boolean>
    {
        private ProgressDialog nDialog;

        @Override
        protected void onPreExecute(){
            super.onPreExecute();

            nDialog.setMessage("Loading..");
            nDialog.setTitle("Checking Network");
            nDialog.setIndeterminate(false);
            nDialog.setCancelable(true);
            nDialog.show();
        }

        @Override
        protected Boolean doInBackground(String... args){


/**
 * Gets current device state and checks for working internet connection by trying Google.
 **/
            ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnected()) {
                try {
                    URL url = new URL("http://www.google.com");
                    HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                    urlc.setConnectTimeout(3000);
                    urlc.connect();
                    if (urlc.getResponseCode() == 200) {
                        return true;
                    }
                } catch (MalformedURLException e1) {
                    // Todo Auto-generated catch block
                    e1.printstacktrace();
                } catch (IOException e) {
                    // Todo Auto-generated catch block
                    e.printstacktrace();
                }
            }
            return false;

        }
        @Override
        protected void onPostExecute(Boolean th){

            if(th == true){
                nDialog.dismiss();
                new ProcessRegister().execute();
            }
            else{
                nDialog.dismiss();
                registerErrorMsg.setText("Error in Network Connection");
            }
        }
    }





    private class ProcessRegister extends AsyncTask<String,JSONObject> {

/**
 * Defining Process dialog
 **/
        private ProgressDialog pDialog;

        String email,password,fname,lname,uname;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            inputUsername = (EditText) findViewById1(R.id.uname);
            inputPassword = (EditText) findViewById1(R.id.pword);
               fname = inputFirstName.getText().toString();
               lname = inputLastName.getText().toString();
                email = inputEmail.getText().toString();
                uname= inputUsername.getText().toString();
                password = inputPassword.getText().toString();

            pDialog.setTitle("Contacting Servers");
            pDialog.setMessage("Registering ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected JSONObject doInBackground(String... args) {


        UserFunctions userFunction = new UserFunctions();
        JSONObject json = userFunction.registerUser(fname,email,uname,password);

            return json;


        }
       @Override
        protected void onPostExecute(JSONObject json) {
       /**
        * Checks for success message.
        **/
                try {
                    if (json.getString(KEY_SUCCESS) != null) {
                        registerErrorMsg.setText("");
                        String res = json.getString(KEY_SUCCESS);

                        String red = json.getString(KEY_ERROR);

                        if(Integer.parseInt(res) == 1){
                            pDialog.setTitle("Getting Data");
                            pDialog.setMessage("Loading Info");

                            registerErrorMsg.setText("Successfully Registered");


                            DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                            JSONObject json_user = json.getJSONObject("user");

                            /**
                             * Removes all the prevIoUs data in the sqlite database
                             **/

                            UserFunctions logout = new UserFunctions();
                            logout.logoutUser(getApplicationContext());
                            db.addUser(json_user.getString(KEY_FirsTNAME),json_user.getString(KEY_LASTNAME),json_user.getString(KEY_EMAIL),json_user.getString(KEY_USERNAME),json_user.getString(KEY_UID),json_user.getString(KEY_CREATED_AT));
                            /**
                             * Stores registered data in sqlite Database
                             * Launch Registered screen
                             **/

                            Intent registered = new Intent(getApplicationContext(),Registered.class);

                            /**
                             * Close all views before launching Registered screen
                            **/
                            registered.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            pDialog.dismiss();
                            startActivity(registered);


                              finish();
                        }

                        else if (Integer.parseInt(red) ==2){
                            pDialog.dismiss();
                            registerErrorMsg.setText("User already exists");
                        }
                        else if (Integer.parseInt(red) ==3){
                            pDialog.dismiss();
                            registerErrorMsg.setText("Invalid Email id");
                        }

                    }


                        else{
                        pDialog.dismiss();

                            registerErrorMsg.setText("Error occured in registration");
                        }

                } catch (JSONException e) {
                    e.printstacktrace();


                }
            }}
        public void NetAsync(View view){
            new NetCheck().execute();
        }
        public void finish() {
            // Todo Auto-generated method stub

        }
        public ConnectivityManager getSystemService(String connectivityService) {
            // Todo Auto-generated method stub
            return null;
        }

}

错误:

说明资源路径位置类型

Type mismatch: cannot convert from LoginFragment to Fragment    TabsPagerAdapter.java   /ATG/src/com/example/atg/adapter    line 20 Java Problem
            Type mismatch: cannot convert from RegisterFragment to Fragment TabsPagerAdapter.java   /ATG/src/com/example/atg/adapter    line 23 Java Problem

解决方法

问题是你的RegisterFragment是一个android.app.Fragment,但你在你的getItem(…)方法中返回一个android.support.v4.app.Fragment.检查您导入Fragment的两个类中的import语句,并确保它们根据应用程序的需要导入正常的android.app.Fragment或支持库android.support.v4.app.Fragment.

Android 图片处理(Matrix,ColorMatrix)

Android 图片处理(Matrix,ColorMatrix)

在编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的效果,有时候还要对图片进行变换,以拉伸,扭曲等等。

这些效果在 android 中有很好的支持,通过颜色矩阵(ColorMatrix)和坐标变换矩阵(Matrix)可以完美的做出上面的所说的效果。

下面将分别介绍这两个矩阵的用法和相关的函数。

颜色矩阵
android 中可以通过颜色矩阵(ColorMatrix 类)方面的操作颜色,颜色矩阵是一个 5x4 的矩阵(如图 1.1)

可以用来方面的修改图片中 RGBA 各分量的值,颜色矩阵以一维数组的方式存储如下:
[ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ]
他通过 RGBA 四个通道来直接操作对应颜色,如果会使用 Photoshop 就会知道有时处理图片通过控制 RGBA 各颜色通道来做出特殊的效果。

这个矩阵对颜色的作用计算方式如 1.3 示:

矩阵的运算规则是矩阵 A 的一行乘以矩阵 C 的一列作为矩阵 R 的一行,

C 矩阵是图片中包含的 ARGB 信息,R 矩阵是用颜色矩阵应用于 C 之后的新的颜色分量,运算结果如下:
R'' = a*R + b*G + c*B + d*A + e;
G'' = f*R + g*G + h*B + i*A + j;
B'' = k*R + l*G + m*B + n*A + o;
A'' = p*R + q*G + r*B + s*A + t;
颜色矩阵并不是看上去那么深奥,其实需要使用的参数很少,而且很有规律第一行决定红色,第二行决定绿色

第三行决定蓝色第四行决定了透明度第五列是颜色的偏移量。下面是一个实际中使用的颜色矩阵。

如果把这个矩阵作用于各颜色分量的话,R=A*C,计算后会发现,各个颜色分量实际上没有任何的改变 (R''=R G''=G B''=B A''=A)。

图 1.5 所示矩阵计算后会发现红色分量增加 100绿色分量增加 100

这样的效果就是图片偏黄,因为红色和绿色混合后得到黄色,黄色增加了 100,图片当然就偏黄了。

改变各颜色分量不仅可以通过修改第 5 列的颜色偏移量也可如上面矩阵所示将对应的颜色值乘以一个倍数,直接放大。

上图 1.6 是将绿色分量乘以 2 变为原来的 2 倍。相信读者至此已经明白了如何通过颜色矩阵来改变各颜色分量。

下面编写一段代码来,通过调整颜色矩阵来获得不同的颜色效果,JavaCode 如下:

CMatrix 类: 
public class CMatrix extends Activity { 
     
    private Button change; 
    private EditText [] et=new EditText[20]; 
    private float []carray=new float[20]; 
    private MyImage sv; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
       change=(Button)findViewById(R.id.set); 
       sv=(MyImage)findViewById(R.id.MyImage); 
     
       for(int i=0;i<20;i++){ 
           
       et[i]=(EditText)findViewById(R.id.indexa+i); 
       carray[i]=Float.valueOf(et[i].getText().toString()); 
       } 
         
       change.setOnClickListener(l); 
    } 
     
    private Button.OnClickListener l=new Button.OnClickListener(){ 
  
       @Override 
       public void onClick(View arg0) { 
           // TODO Auto-generated method stub 
            getValues(); 
           sv.setValues(carray); 
           sv.invalidate(); 
       } 
         
    }; 
    public   void getValues(){ 
        for(int i=0;i<20;i++){ 
             
            carray[i]=Float.valueOf(et[i].getText().toString()); 
        } 
         
    } 
  
     

MyImage 类继承自 View 类: 
public class MyImage extends View { 
    private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    private Bitmap mBitmap; 
    private float [] array=new float[20]; 
     
    private float mAngle; 
     
    public MyImage(Context context,AttributeSet attrs) { 
        super(context,attrs); 
         
        mBitmap = BitmapFactory.decodeResource(context.getResources(),  R.drawable.test); 
        invalidate(); 
    } 
    
     
    public void setValues(float [] a){ 
        for(int i=0;i<20;i++){ 
           array[i]=a[i]; 
        } 
         
    } 
     
    @Override protected void onDraw(Canvas canvas) { 
        Paint paint = mPaint; 
         
         
         
        paint.setColorFilter(null); 
        canvas.drawBitmap(mBitmap, 0, 0, paint); 
         
       ColorMatrix cm = new ColorMatrix(); 
       // 设置颜色矩阵 
       cm.set(array); 
// 颜色滤镜,将颜色矩阵应用于图片 
        paint.setColorFilter(new ColorMatrixColorFilter(cm)); 
// 绘图 
        canvas.drawBitmap(mBitmap, 0, 0, paint);  
        } 
    
}

CMatrix 类主要负责接收颜色矩阵的设置和重绘,没有要说的。MyImage 类中进行绘图工作,首先设置颜色矩阵 cm.set (..) 从一维数组中读取数据 20 个数据给颜色矩阵赋值,paint.setColorFilter (..) 设置颜色滤镜,然后绘图,效果就出来了(这个过程和 PS 差不多)如下:

 

 

 

看到这里,相信大家对颜色矩阵的作用已经有了一个直观的感受,现在也可以尝试做一个照片特效的软件。

但是各种效果并不能让用户手动调节颜色矩阵,这里需要计算公式,由于本人并不是做图形软件的也不能提供,可以参考这个链接:
http://www.adobe.com/devnet/flash/articles/matrix_transformations/ColorMatrixDemo.swf


坐标变换矩阵
坐标变换矩阵是一个 3*3 的矩阵如图 2.1,用来对图形进行坐标变化,将原来的坐标点转移到新的坐标点,

因为一个图片是有点阵和每一点上的颜色信息组成的,所以对坐标的变换,就是对每一点进行搬移形成新的图片。

具体的说图形的放大,缩小,移动,旋转,透视,扭曲这些效果都可以用此矩阵来完成。


这个矩阵的作用是对坐标 x,y 进行变换计算结果如下:
x''=a*x+b*y+c
y''=d*x+e*y+f
通常情况下 g=h=0, 这样使 1=0*x+0*y+1 恒成立。和颜色矩阵一样,坐标变换矩阵真正使用的参数很少也很有规律。


上图就是一个坐标变换矩阵的简单例子,计算后发现 x''=x+50,y''=y+50.

可见图片的每一点都在 x 和 y 方向上平移到了(50,50)点处,这种效果就是平移效果,将图片转移到了(50,50)处。

 

计算上面得矩阵 x''=2*x,y‘=2*y. 经过颜色矩阵和上面转移效果学习,相信读者可以明白这个矩阵的作用了,这个矩阵对图片进行了放大,具体的说是放大了二倍。
下面将介绍几种常用的变换矩阵:
1.      旋转

绕原点逆时针旋转 θ 度角的变换公式是 x'' = xcosθ − ysinθ 与 y。'' = xsinθ +    ycosθ
2.      缩放

变换后长宽分别放大 x''=scale*x;y''=scale*y.
3.         切变

4.         反射

(,) 单位向量
5.         正投影

(,) 单位向量
 
上面的各种效果也可以叠加在一起,既矩阵的组合变换,可以用矩阵乘法实现之,如:R=B (A*C)=(B*A) C, 注意一点就是 B*A 和 A*B 一般是不等的。

下面将编一个小程序,通过控制坐标变换矩阵来达到控制图形的目的,JavaCode 如下:

 

CooMatrix 类: 
 
3public class CooMatrix extends Activity { 
    
   private Button change; 
   private EditText [] et=new EditText[9]; 
   private float []carray=new float[9]; 
   private MyImage sv; 
   /** Called when the activity is first created. */ 
   @Override 
   public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 
        
      change=(Button)findViewById(R.id.set); 
      sv=(MyImage)findViewById(R.id.MyImage); 
      
      for(int i=0;i<9;i++){ 
          
      et[i]=(EditText)findViewById(R.id.indexa+i); 
      carray[i]=Float.valueOf(et[i].getText().toString()); 
       
      } 
        
     change.setOnClickListener(l); 
        
      
   } 
    
   private Button.OnClickListener l=new Button.OnClickListener(){ 
 
      @Override 
      public void onClick(View arg0) { 
          // TODO Auto-generated method stub 
          getValues(); 
          sv.setValues(carray); 
          sv.invalidate(); 
      } 
        
   }; 
   public   void getValues(){ 
       for(int i=0;i<9;i++){ 
            
           carray[i]=Float.valueOf(et[i].getText().toString()); 
       } 
        
   }  
  
    

MyImage 类继承自 View 类: 

public class MyImage extends View { 
   private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
   private Bitmap mBitmap; 
   private float [] array=new float[9]; 
    
    
    
   public MyImage(Context context,AttributeSet attrs) { 
       super(context,attrs); 
        
       mBitmap = BitmapFactory.decodeResource(context.getResources(), 
                                              R.drawable.ic_launcher_android); 
       invalidate(); 
   } 
   
    
   public void setValues(float [] a){ 
       for(int i=0;i<9;i++){ 
          array[i]=a[i]; 
       } 
        
   } 
    
   @Override protected void onDraw(Canvas canvas) { 
       Paint paint = mPaint; 
       canvas.drawBitmap(mBitmap, 0, 0, paint); 
       //new 一个坐标变换矩阵 
       Matrix cm = new Matrix(); 
// 为坐标变换矩阵设置响应的值 
      cm.setValues(array); 
// 按照坐标变换矩阵的描述绘图 
       canvas.drawBitmap(mBitmap, cm, paint); 
       Log.i("CMatrix", "--------->onDraw"); 
 
       
   }

上面的代码中类 CooMatrix 用于接收用户输入的坐标变换矩阵参数,类 MyImage 接收参数,通过 setValues () 设置矩阵参数,然后 Canvas 调用 drawBitmap 绘图。效果如下:

 

上面给出了用坐标变换矩阵做出的各种效果,用坐标变换矩阵可以方面的调节图形的各种效果,

但是我们看看 Matrix 类就可以发现,实际上,matrix 类本身已经提供了许多类似的方法,我们只要调用,就可以了。
setScale (float sx, float sy, float px, float py) 放大 
setSkew (float kx, float ky, float px, float py) 斜切 
setTranslate (float dx, float dy)                       平移 
setRotate (float degrees, float px, float py)    旋转 
上面的函数提供了基本的变换平移,放大,旋转,斜切。为了做出更复杂的变换,同时不必亲手去改动坐标变换矩阵,

Matrix 类提供了许多 Map 方法,将原图形映射到目标点构成新的图形,

下面简述 setPolyToPoly (float [] src, int srcIndex, float [] dst, int dstIndex, int pointCount) 的用法,希望起到举一反三的作用。

参数 src 和 dst 是分别存储了原图像的点和和指定的目标点的一维数组,数组中存储的坐标格式如下:
[x0, y0, x1, y1, x2,y2,...]
这个个函数将 src 中的坐标映射到 dst 中的坐标,实现图像的变换。

具体的例子可以参考 APIDemos 里的 PolyToPoly,我在这里就不再贴代码了,只讲一下函数是怎么变换图片的。下面是效果:

 

图中写 1 的是原图,写有 2,3,4 的是变换后的图形。现在分析 2 是怎么变换来的,变换的原坐标点和目的坐标点如下:
src=new float[] { 32, 32, 64, 32 }
dst=new float[] { 32, 32, 64, 48 }

从上图标示出的坐标看出原图的(32,32)映射到原图的(32,32),(64,32)映射到原图(64,48)这样的效果是图像放大了而且发生了旋转。这样的过程相当于(32,32)点不动,然后拉住图形(64,32)点并拉到(64,48)点处,这样图形必然会被拉伸放大并且发生旋转。最后用一个平移将图形移动到右边现在的位置。希望能够好好理解这一过程,下面的 3,4 图是同样的道理。

 

http://www.cnblogs.com/leon19870907/articles/1978065.html

今天关于类型不匹配:无法从ByteMatrix转换为BitMatrix类型不匹配不能从int转化为boolean的介绍到此结束,谢谢您的阅读,有关Android ZXING通过BitMatrix编码qr->存储到byte []->插入数据库、android – 类型不匹配:无法将void转换为toast、android – 类型类型不匹配:无法从RegisterFragment转换为Fragment、Android 图片处理(Matrix,ColorMatrix)等更多相关知识的信息可以在本站进行查询。

本文标签: