برنامه نویسی اندروید

اموزش برنامه نویسی اندروید تخصصی

برنامه نویسی اندروید

اموزش برنامه نویسی اندروید تخصصی

۵ مطلب با موضوع «imageview» ثبت شده است

تعیین یک عکس قرار گرفته در حافظه خارجی (External Storage) به عنوان عکس پس زمینه گوشی (wallpaper)، در برنامه نویسی اندروید

فرض کنید که یک عکس در مسیر زیر از حافظه خارجی (External Storage) قرار دارد و قصد داریم که آن را به عنوان عکس پس زمینه گوشی (wallpaper) قرار دهیم :

 
/myFolder/myImage.jpg

برای این منظور، باید کد زیر در Activity اجرا شود :

 
String photoPath = Environment.getExternalStorageDirectory()+"/myFolder/myImage.jpg";
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(photoPath, options);
WallpaperManager wpm = WallpaperManager.getInstance(getApplicationContext());
try {
    wpm.setBitmap(bitmap);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

در کد بالا، ابتدا عکس را از حافظه خارجی (External Storage) خوانده و به Bitmap تبدیل می کنیم. سپس با استفاده از روش setBitmap از کلاس WallpaperManager ، آن را به عنوان عکس پس زمینه گوشی (wallpaper) قرار می دهیم.

برای اجرای صحیح کد بالا، باید اجازه های دسترسی مربوط به تغییر عکس پس زمینه گوشی (wallpaper) و همچنین خواندن و نوشتن در حافظه خارجی (External Storage) را در فایل AndroidManifest.xml از پروژه اندروید ذکر کنیم :

 
<uses-permission android:name="android.permission.SET_WALLPAPER" />  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

به عنوان مثال، فایل AndroidManifest.xml پروژه اندروید می تواند به شکل کلی زیر باشد :

 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kelidestan.example"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
 
    <uses-permission android:name="android.permission.SET_WALLPAPER" />  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.kelidestan.example.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
  • vahid hasani




کد های مربوط به layuot

- <LinearLayout xmlns:android="
" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:background="#000000" android:baselineAligned="false" tools:context=".MainActivity">

<LinearLayout android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical">

<ScrollView android:id="@+id/scrollView1" android:layout_width="match_parent" android:layout_height="77dp">
- <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
  

<TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#009900" android:text="" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="#EEEEEE" /> 
  

<TextView android:id="@+id/textView3" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ff6600" android:text="" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="#EEEEEE" /> 
  

<TextView android:id="@+id/textView4" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ff00cc" android:text="" android:textColor="#EEEEEE" android:textAppearance="?android:attr/textAppearanceMedium" /> 
 

 <TextView android:id="@+id/textView5" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" android:textColor="#EEEEEE" android:textAppearance="?android:attr/textAppearanceMedium" /> 
  </LinearLayout>
  </ScrollView>
  
<Button android:id="@+id/btnCapturePicture" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginBottom="10dp" android:background="@drawable/gerd" android:text="عکس گرفتن" android:textColor="#EEEEEE" /> 
  <Button android:id="@+id/btnRecordVideo" android:layout_width="80dp" android:layout_height="80dp" android:background="@drawable/gerd" android:text="فیلم برداری" android:textColor="#EEEEEE" /> 
  </LinearLayout>
- <LinearLayout android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:orientation="vertical" android:padding="10dp">
  <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="نمایش محتوا" android:padding="10dp" android:textColor="#EEEEEE" android:textSize="15dp" /> 
  <ImageView android:id="@+id/imgPreview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#EEEEEE" android:visibility="gone" /> 
  <VideoView android:id="@+id/videoPreview" android:layout_width="wrap_content" android:layout_height="400dp" android:visibility="gone" /> 
  </LinearLayout>
  </LinearLayout> 

کد های کلاس جاوا


import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;

public class Camera_Test extends Activity {
    
    MediaPlayer mdp,answer,errorr;

     private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
        private static final int CAMERA_CAPTURE_VIDEO_REQUEST_CODE = 200;
        public static final int MEDIA_TYPE_IMAGE = 1;
        public static final int MEDIA_TYPE_VIDEO = 2;
        TextView tv1,tv2,tv3,tv4;
     
        // directory name to store captured images and videos
        private static final String IMAGE_DIRECTORY_NAME = "AndroidSajad";
     
        private Uri fileUri; // file url to store image/video
     
        private ImageView imgPreview;
        private VideoView videoPreview;
        private Button btnCapturePicture, btnRecordVideo;
     
        
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera_test);
        
        
        mdp = MediaPlayer.create(Camera_Test.this,R.raw.loading);
        answer = MediaPlayer.create(Camera_Test.this,R.raw.answerq);
        errorr = MediaPlayer.create(Camera_Test.this,R.raw.errorr);
        
        tv1 = (TextView)findViewById(R.id.textView2);
        tv2 = (TextView)findViewById(R.id.textView3);

        tv3 = (TextView)findViewById(R.id.textView4);
        tv4 = (TextView)findViewById(R.id.textView5);

         imgPreview = (ImageView) findViewById(R.id.imgPreview);
            videoPreview = (VideoView) findViewById(R.id.videoPreview);
            btnCapturePicture = (Button) findViewById(R.id.btnCapturePicture);
            btnRecordVideo = (Button) findViewById(R.id.btnRecordVideo);
     
           
            btnCapturePicture.setOnClickListener(new View.OnClickListener() {
     
                @Override
                public void onClick(View v) {
                    // capture picture
                    answer.start();
                    captureImage();
                }
            });
     
           
            btnRecordVideo.setOnClickListener(new View.OnClickListener() {
     
                @Override
                public void onClick(View v) {
                    // record video
                    answer.start();
                    recordVideo();
                }
            });
     
            // Checking camera availability
            if (!isDeviceSupportCamera()) {
                errorr.start();
                Toast.makeText(getApplicationContext(),
                        "دوربین دستگاه شما پشتیبانی نمی شود",
                        Toast.LENGTH_LONG).show();
                finish();
            }
        }
     
      
        private boolean isDeviceSupportCamera() {
            if (getApplicationContext().getPackageManager().hasSystemFeature(
                    PackageManager.FEATURE_CAMERA)) {
                // this device has a camera
                return true;
            } else {
                // no camera on this device
                return false;
            }
        }
     
        /**
         * Capturing Camera Image will lauch camera app requrest image capture
         */
        private void captureImage() {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
     
            fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
     
            intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
     
            // start the image capture Intent
            startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
            tv1.setText("فعال کردن دوربین...");
        }
     
       
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
     
           
            outState.putParcelable("sajad", fileUri);
        }
     
        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
     
            // get the file url
            fileUri = savedInstanceState.getParcelable("sajad");
        }
     
        
        private void recordVideo() {
            Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
     
            fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);
     
           
            intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
     
            intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
     
            
            startActivityForResult(intent, CAMERA_CAPTURE_VIDEO_REQUEST_CODE);
        }
     
       
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            // if the result is capturing Image
            if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
                if (resultCode == RESULT_OK) {
                    tv2.setText("عکس گرفته شد");
                    previewCapturedImage();
                } else if (resultCode == RESULT_CANCELED) {
                    // user cancelled Image capture
                    tv2.setText("؟؟؟لغو عکس گرفتن");
                } else {
                    // failed to capture image
                    tv2.setText("!!!اشکال در گرفتن عکس");
                }
            } else if (requestCode == CAMERA_CAPTURE_VIDEO_REQUEST_CODE) {
                if (resultCode == RESULT_OK) {
                    tv2.setText("ویدیو با موفقیت ثبت شد");
                    // video successfully recorded
                    // preview the recorded video
                    previewVideo();
                } else if (resultCode == RESULT_CANCELED) {
                    // user cancelled recording
                    tv2.setText("ضبط فیلم متوقف شد!!!");
                } else {
                    // failed to record video
                    tv2.setText("خطا در ضبط فیلم...؟؟؟");
                }
            }
        }
     
        /**
         * Display image from a path to ImageView
         */
        private void previewCapturedImage() {
            try {
                // hide video preview
                videoPreview.setVisibility(View.GONE);
     
                imgPreview.setVisibility(View.VISIBLE);
     
                // bimatp factory
                BitmapFactory.Options options = new BitmapFactory.Options();
     
                // downsizing image as it throws OutOfMemory Exception for larger
                // images
                options.inSampleSize = 8;
     
                final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(),
                        options);
     
                imgPreview.setImageBitmap(bitmap);
                tv3.setText("ذخیره عکس انجام شد");
            } catch (NullPointerException e) {
                e.printStackTrace();
            }
        }
     
        /**
         * Previewing recorded video
         */
        private void previewVideo() {
            try {
                // hide image preview
                imgPreview.setVisibility(View.GONE);
                tv3.setText("ذخیره فیلم انجام شد");
                videoPreview.setVisibility(View.VISIBLE);
                videoPreview.setVideoPath(fileUri.getPath());
                // start playing
                videoPreview.start();
                tv4.setText("نمایش فیلم گرفته شده ");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
         
        /**
         * ------------ Helper Methods ----------------------
         * */
     
        /**
         * Creating file uri to store image/video
         */
        public Uri getOutputMediaFileUri(int type) {
            return Uri.fromFile(getOutputMediaFile(type));
        }
     
        /**
         * returning image / video
         */
        private static File getOutputMediaFile(int type) {
     
            // External sdcard location
            File mediaStorageDir = new File(
                    Environment
                            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                    IMAGE_DIRECTORY_NAME);
     
            // Create the storage directory if it does not exist
            if (!mediaStorageDir.exists()) {
                if (!mediaStorageDir.mkdirs()) {
                    Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create "
                            + IMAGE_DIRECTORY_NAME + " directory");
                    return null;
                }
            }
     
            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                    Locale.getDefault()).format(new Date());
            File mediaFile;
            if (type == MEDIA_TYPE_IMAGE) {
                mediaFile = new File(mediaStorageDir.getPath() + File.separator
                        + "IMG_" + timeStamp + ".jpg");
            } else if (type == MEDIA_TYPE_VIDEO) {
                mediaFile = new File(mediaStorageDir.getPath() + File.separator
                        + "VID_" + timeStamp + ".mp4");
            } else {
                return null;
            }
     
            return mediaFile;
        }
    } 

فقط مجوز ها رو خودت در منیفست وارد کن"

  • vahid hasani

قبلا شیوه نمایش یک عکس در یک ImageView توسط کد را آموزش دادیم. گاهی نیاز داریم که بررسی کنیم که آیا یک عکس وجود دارد یا خیر و در صورت وجود داشتن در پوشه drawable ، آنگاه عکس در ImageView نمایش داده شود. برای این منظور می توانیم از ترکیب try و catch استفاده کنیم. این ترکیب، زمانی به کار می رود که یک سری دستور داریم و می خواهیم در صورتی که در هنگام اجرای آنها، خطایی رخ داد، آنگاه یک سری دستور دیگر نمایش داده شود.

با فرض اینکه ImageView دارای id با نام imageView1 باشد و نام عکس مورد نظرمان که در پوشه drawable قرار گرفته است، برابر image_1 باشد (با پسوند دلخواه، مثلا png)، آنگاه کدهای زیر را می نویسیم :

 
ImageView img = (ImageView) findViewById(R.id.imageView1);
String imageName = "image_1";  
try {
    int resID = getResources().getIdentifier(imageName,"drawable",getPackageName());
    img.setImageResource(resID);
} catch (Exception e) {
}
  • vahid hasani

در این مبحث، عنصر ImageView را توسعه (extend) می دهیم و یک عنصر جدید با نام TouchImageView می سازیم که ویزگی های ImageView را دارد و در عین حال، دارای قابلیت بزرگنمایی (zoom) دو انگشتی نیز می باشد.

در این پروژه اندروید، کدهای کلاس TouchImageView.java را بنده قبلا از یک سایت انگلیسی زبان گرفته بودم، اما متاسفانه آدرس آن را به خاطر ندارم که لینک منبع را ذکر کنم.

به عنوان یک مثال، پس از ساخت عنصر TouchImageView ، عکس زیر را در آن قرار می دهیم :

ایجاد امکان بزرگنمایی (zoom) دو انگشتی برای عکس نمایش داده شده در ImageView ، با توسعه عنصر ImageView ، در برنامه نویسی اندروید

گوشی را می چرخانیم تا عکس، بهتر نمایش داده شود (بخش بیشتری از عنصر را بپوشاند) :

ایجاد امکان بزرگنمایی (zoom) دو انگشتی برای عکس نمایش داده شده در ImageView ، با توسعه عنصر ImageView ، در برنامه نویسی اندروید

سپس با استفاده از قابلیت بزرگنمایی (zoom) دو انگشتی، بخشی از عکس را بزرگتر نمایش می دهیم :

ایجاد امکان بزرگنمایی (zoom) دو انگشتی برای عکس نمایش داده شده در ImageView ، با توسعه عنصر ImageView ، در برنامه نویسی اندروید

 

در ادامه، بخش های مهم پروژه اندروید را شرح می دهیم.

در برنامه eclipse ، ابتدا یک پروژه اندروید با نام ImageViewZoom می سازیم (نام package را برابر com.kelidestan.imageviewzoom انتخاب می کنیم. نام Activity اصلی را برابر MainActivity انتخاب می کنیم و فایل xml متناظر آن را هم برابر activity_main قرار می دهیم).

یک عکس با نام image.jpg را در پوشه drawable-hdpi قرار می دهیم (همان عکسی که می خواهیم نمایش داده شود) :

ایجاد امکان بزرگنمایی (zoom) دو انگشتی برای عکس نمایش داده شده در ImageView ، با توسعه عنصر ImageView ، در برنامه نویسی اندروید

همان طور که گفتیم، باید عنصر ImageView را توسعه (extend) بدهیم و یک عنصر جدید با نام دلخواه TouchImageView بسازیم. برای این منظور، یک کلاس (class) با نام TouchImageView بسازیم :

ایجاد امکان بزرگنمایی (zoom) دو انگشتی برای عکس نمایش داده شده در ImageView ، با توسعه عنصر ImageView ، در برنامه نویسی اندروید

کدهای فایل TouchImageView.java را به صورت زیر می نویسیم :

 



import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.ImageView;

public class TouchImageView extends ImageView {

    Matrix matrix;

    // We can be in one of these 3 states
    static final int NONE = 0;
    static final int DRAG = 1;
    static final int ZOOM = 2;
    int mode = NONE;

    // Remember some things for zooming
    PointF last = new PointF();
    PointF start = new PointF();
    float minScale = 1f;
    float maxScale = 3f;
    float[] m;


    int viewWidth, viewHeight;
    static final int CLICK = 3;
    float saveScale = 1f;
    protected float origWidth, origHeight;
    int oldMeasuredWidth, oldMeasuredHeight;


    ScaleGestureDetector mScaleDetector;

    Context context;

    public TouchImageView(Context context) {
        super(context);
        sharedConstructing(context);
    }

    public TouchImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        sharedConstructing(context);
    }
   
    private void sharedConstructing(Context context) {
        super.setClickable(true);
        this.context = context;
        mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
        matrix = new Matrix();
        m = new float[9];
        setImageMatrix(matrix);
        setScaleType(ScaleType.MATRIX);

        setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mScaleDetector.onTouchEvent(event);
                PointF curr = new PointF(event.getX(), event.getY());

                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        last.set(curr);
                        start.set(last);
                        mode = DRAG;
                        break;
                       
                    case MotionEvent.ACTION_MOVE:
                        if (mode == DRAG) {
                            float deltaX = curr.x - last.x;
                            float deltaY = curr.y - last.y;
                            float fixTransX = getFixDragTrans(deltaX, viewWidth, origWidth * saveScale);
                            float fixTransY = getFixDragTrans(deltaY, viewHeight, origHeight * saveScale);
                            matrix.postTranslate(fixTransX, fixTransY);
                            fixTrans();
                            last.set(curr.x, curr.y);
                        }
                        break;

                    case MotionEvent.ACTION_UP:
                        mode = NONE;
                        int xDiff = (int) Math.abs(curr.x - start.x);
                        int yDiff = (int) Math.abs(curr.y - start.y);
                        if (xDiff < CLICK && yDiff < CLICK)
                            performClick();
                        break;

                    case MotionEvent.ACTION_POINTER_UP:
                        mode = NONE;
                        break;
                }
               
                setImageMatrix(matrix);
                invalidate();
                return true; // indicate event was handled
            }

        });
    }

    public void setMaxZoom(float x) {
        maxScale = x;
    }

    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            mode = ZOOM;
            return true;
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            float mScaleFactor = detector.getScaleFactor();
            float origScale = saveScale;
            saveScale *= mScaleFactor;
            if (saveScale > maxScale) {
                saveScale = maxScale;
                mScaleFactor = maxScale / origScale;
            } else if (saveScale < minScale) {
                saveScale = minScale;
                mScaleFactor = minScale / origScale;
            }

            if (origWidth * saveScale <= viewWidth || origHeight * saveScale <= viewHeight)
                matrix.postScale(mScaleFactor, mScaleFactor, viewWidth / 2, viewHeight / 2);
            else
                matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY());

            fixTrans();
            return true;
        }
    }

    void fixTrans() {
        matrix.getValues(m);
        float transX = m[Matrix.MTRANS_X];
        float transY = m[Matrix.MTRANS_Y];
       
        float fixTransX = getFixTrans(transX, viewWidth, origWidth * saveScale);
        float fixTransY = getFixTrans(transY, viewHeight, origHeight * saveScale);

        if (fixTransX != 0 || fixTransY != 0)
            matrix.postTranslate(fixTransX, fixTransY);
    }

    float getFixTrans(float trans, float viewSize, float contentSize) {
        float minTrans, maxTrans;

        if (contentSize <= viewSize) {
            minTrans = 0;
            maxTrans = viewSize - contentSize;
        } else {
            minTrans = viewSize - contentSize;
            maxTrans = 0;
        }

        if (trans < minTrans)
            return -trans + minTrans;
        if (trans > maxTrans)
            return -trans + maxTrans;
        return 0;
    }
   
    float getFixDragTrans(float delta, float viewSize, float contentSize) {
        if (contentSize <= viewSize) {
            return 0;
        }
        return delta;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        viewWidth = MeasureSpec.getSize(widthMeasureSpec);
        viewHeight = MeasureSpec.getSize(heightMeasureSpec);
       
        //
        // Rescales image on rotation
        //
        if (oldMeasuredHeight == viewWidth && oldMeasuredHeight == viewHeight
                || viewWidth == 0 || viewHeight == 0)
            return;
        oldMeasuredHeight = viewHeight;
        oldMeasuredWidth = viewWidth;

        if (saveScale == 1) {
            //Fit to screen.
            float scale;

            Drawable drawable = getDrawable();
            if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0)
                return;
            int bmWidth = drawable.getIntrinsicWidth();
            int bmHeight = drawable.getIntrinsicHeight();
           
            Log.d("bmSize", "bmWidth: " + bmWidth + " bmHeight : " + bmHeight);

            float scaleX = (float) viewWidth / (float) bmWidth;
            float scaleY = (float) viewHeight / (float) bmHeight;
            scale = Math.min(scaleX, scaleY);
            matrix.setScale(scale, scale);

            // Center the image
            float redundantYSpace = (float) viewHeight - (scale * (float) bmHeight);
            float redundantXSpace = (float) viewWidth - (scale * (float) bmWidth);
            redundantYSpace /= (float) 2;
            redundantXSpace /= (float) 2;

            matrix.postTranslate(redundantXSpace, redundantYSpace);

            origWidth = viewWidth - 2 * redundantXSpace;
            origHeight = viewHeight - 2 * redundantYSpace;
            setImageMatrix(matrix);
        }
        fixTrans();
    }
}

به این خط از کدها توجه کنید :

 

public class TouchImageView extends ImageView {

این خط از کدها بیان می کند که کلاس TouchImageView بر اساس توسعه (extend) کلاس ImageView (عنصر ImageView) ساخته شود.

چون یک عنصر جدید ساخته ایم، باید در فایل xml مربوط به Activity (یعنی فایل activity_main.xml)، عنصر TouchImageView را به جای عنصر ImageView به کار ببریم (در واقع، برای هر عکسی که می خواهیم قابلیت بزرگنمایی دو انگشتی داشته باشد) :

ایجاد امکان بزرگنمایی (zoom) دو انگشتی برای عکس نمایش داده شده در ImageView ، با توسعه عنصر ImageView ، در برنامه نویسی اندروید

بنابراین، کدهای فایل activity_main.xml را به صورت زیر می نویسیم :

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <com.too.imageviewzoom.TouchImageView
            android:id="@+id/touchImageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

</LinearLayout>

نکته مهم در کد بالا این است که ما به جای نام TouchImageView ، نام زیر را برای عنصر نوشته ایم :

 

com.too.imageviewzoom.TouchImageView

که در آن، com.kelidestan.imageviewzoom برابر همان نام package برنامه اندروید ما می باشد، بنابراین دقت داشته باشید که در برنامه اندروید خود، ابتدا نام package برنامه خود را بنویسید و سپس نام TouchImageView را در انتهای آن قرار بدهید (اگر نام package را اشتباه بنویسید، یک خطا به وجود می آید و برنامه اندروید با Force Close روبرو می شود).

و در آخر، به سراغ فایل مربوط به Activity برنامه می رویم (یعنی فایل MainActivity.java) :

ایجاد امکان بزرگنمایی (zoom) دو انگشتی برای عکس نمایش داده شده در ImageView ، با توسعه عنصر ImageView ، در برنامه نویسی اندروید

کدهای فایل MainActivity.java را به صورت زیر می نویسیم :

 



import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
               
                TouchImageView img = (TouchImageView) findViewById(R.id.touchImageView);
                img.setImageResource(R.drawable.image);
                img.setMaxZoom(4f);
        }


}

مشاهده می کنید که در هنگام تعریف عنصر TouchImageView در فایل java ، به صورت زیر عمل شده است :

 

TouchImageView img = (TouchImageView) findViewById(R.id.touchImageView);
  • vahid hasani

 

به دو دلیل:

یک حجم نرم افزار کمتر میشه به دلیل استفاده نکردن از چندین رزولوشن برای عکس هامون

دو کیفیت عکس در تمامی رزولوشن ها یکیه فرق نمیکنه یا بهتر بگم افت کیفیت نداریم

چه فرقی بین عکس های وکتور با عکس های معمولیه ؟

 

.ببینید تصاویر معمولی از قسمت های  کوچیکی به نام پیکسل تشکیل شدن  یعنی اگر روی یه عکس زوم کنیم میبینیم که به مربع های کوچیکی تقسیم بندی شدن.  هر پیکسل از سه تا عدد تشکیل شده که هر عدد میتونه از صفر تا ۲۵۶ باشه  که این سه تا عدد هر کدومشون به یه رنگ  قرمز سبز آبی اشاره میکنن  و مقدار این عداد شدته رنگ ها رو تعیین میکنه یعنی هر چی عدد رنگ ها به ۲۵۶ نزدیک تر باشه شدت اون رنگ بیشتر و هر چی به صفر نزدیک تر باشه  شدت رنگ کمتر میشه اگر هر سه تا رنگ صفر باشن پس شدتی تو هیچ رنگی وجود نداره میشه سیاه اون پیکسل و برعکس.

 

  • vahid hasani