【问题标题】:PinchToZoom not working with multiple activities in AndroidPinchToZoom 不适用于 Android 中的多个活动
【发布时间】:2015-11-19 19:45:56
【问题描述】:

我正在尝试实现捏缩放,在我的项目中,我使用了多个将它们互连的活动。最初,当我在一项活动中完成我的项目时,它正在执行缩放,但多项活动并非如此。

代码:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.kmay.calculatephase">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:debuggable="true"
    android:theme="@style/AppTheme" >
    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".LoadImage" >
    </activity>
    <activity android:name=".Phase" >
    </activity>
    <activity android:name=".ColorGray" >
    </activity>
    <activity android:name=".Information" >
    </activity>
</application>

代码:MainActivity.java

package com.example.stiwari.myappli;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {
    Button btn1;Bitmap imgb;Bitmap operation;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn1 = (Button) findViewById(R.id.btn1);
        Bitmap bmp;
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent rawIntent = new Intent(Intent.ACTION_PICK);
                File pictureDirectory =  Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
                String pictureDirectoryPath = pictureDirectory.getPath();
                Uri data = Uri.parse(pictureDirectoryPath);
                rawIntent.setDataAndType(data, "image/*");
                startActivityForResult(rawIntent, 10);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode==RESULT_OK){
            if(requestCode==10){
                final float red = (float) 0.299;
                final float green = (float) 0.587;
                final float blue = (float) 0.114;
                final Uri imagef = data.getData();
                InputStream streamI;
                try {
                    streamI = getContentResolver().openInputStream(imagef);
                    //Create bitmap from selected image
                    imgb = BitmapFactory.decodeStream(streamI);
                    //Define rows and columns of selected image
                    int rows = imgb.getHeight();int cols = imgb.getWidth();
                    operation = Bitmap.createBitmap(cols, rows, imgb.getConfig());
                    //Convert original image to Gray Image
                    for (int i=0;i<cols;i++){
                        for(int j=0;j<rows;j++){
                            int p = imgb.getPixel(i,j);
                            int r = Color.red(p);
                            int g = Color.green(p);
                            int b = Color.blue(p);
                            r = (int) (red*r);
                            g = (int) (green*g);
                            b = (int) (blue*b);
                            int gray = (int) (r*0.299+g*0.587+b*0.114);
                            operation.setPixel(i, j, Color.argb(Color.alpha(p), gray, gray, gray));
                        }
                    }
                } catch (FileNotFoundException e) {
                    e.printStackTrace();}
            }
            //Use Intent property to send data to Main2Activity.class
            Intent i = new Intent(this,Main2Activity.class);
            ByteArrayOutputStream bs = new ByteArrayOutputStream();
            operation.compress(Bitmap.CompressFormat.PNG, 50, bs);
            i.putExtra("byteArray", bs.toByteArray());
            startActivity(i);
        }
    }
}

代码:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Next Page"
    android:id="@+id/btn1"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />

代码:Main2Activity.java

package com.example.stiwari.myappli;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.ImageView;
public class Main2Activity extends AppCompatActivity {
    Bitmap imgb;
    ImageView imageView1;float scaleFactor;View view;
    ScaleGestureDetector detector;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        imageView1 = (ImageView) findViewById(R.id.imageView1);
        detector = new ScaleGestureDetector(this, new ScaleListener());


    if (getIntent().hasExtra("byteArray")) {
        //ImageView previewThumbnail = new ImageView(this);
        imgb = BitmapFactory.decodeByteArray(
                getIntent().getByteArrayExtra("byteArray"), 0, getIntent().getByteArrayExtra("byteArray").length);
        //previewThumbnail.setImageBitmap(imgb);
    }imageView1.setImageBitmap(imgb);

    imageView1.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Main2Activity.this.view = v;
            detector.onTouchEvent(event);
            return false;
        }
    });
}

代码:activity_main2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.stiwari.myappli.Main2Activity">

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView1"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />

【问题讨论】:

    标签: android android-layout android-intent android-activity


    【解决方案1】:

    使用以下代码进行双指缩放。

    ScaleGestureDetector detector = new ScaleGestureDetector(this, new ScaleListener());
    
    
    private class ScaleListener extends
            ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            scaleFactor *= detector.getScaleFactor();
            scaleFactor = (scaleFactor < 1 ? 1 : scaleFactor);
            scaleFactor = ((float) ((int) (scaleFactor * 100))) / 100;
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);
            return true;
        }
    }
    

    另外,在 onCreate 上设置一个 touchListener 来查看(你想要缩放的那个)。 例子

    (YOUR_VIEW).setClickable(true);
    
     (YOUR_VIEW).setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
    
                        MainActivity.this.view = v;
                        detector.onTouchEvent(event);
    
                    return false;
    
            });
    

    希望这会有所帮助:)

    更新 1:

    根据你的 code.change 条件,像这样

    imageView1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                 if (event.getAction() == MotionEvent.ACTION_UP) {
                    } else {
                         Main2Activity.this.view = v;
                detector.onTouchEvent(event);
                    }
                return false;
            }
        });
    

    【讨论】:

    • view.setScaleX(scaleFactor); 中的视图是什么我应该在哪里申报?
    • 还有什么是第二块中的 MainActivity
    • 这就是我们的 mainActivity ...声明一个公共视图( View view; )...定义是在触摸监听器上进行的..( MainActivity.this.view = v;)..知道了?
    • -抱歉回复晚了,但我仍然有这个错误:MainActivity 不是封闭类。
    • 你的活动名称是什么?
    猜你喜欢
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    相关资源
    最近更新 更多