简体   繁体   English

如何在同一活动中移动图像并缩放或调整其大小

[英]How can I move an image and scale or resize it in the same activity

how's it going?怎么样了? I was wondering if anyone had any ideas on how to move an image and resize it within the same activity?我想知道是否有人对如何在同一活动中移动图像并调整其大小有任何想法? I setup a listener to move the image and that works well.我设置了一个监听器来移动图像,效果很好。 The commented out code was used to resize the image and that worked well also.注释掉的代码用于调整图像大小,并且效果很好。 But I am struggling to figure out how to implement some kind of GestureDetector or something similar to do both.但我正在努力弄清楚如何实现某种 GestureDetector 或类似的东西来实现两者。 Here is the code I have so far:这是我到目前为止的代码:


    private static final String TAG = "CreateOutfitActivity";

    Context mContext;

    ImageView bodyImage, outfitOne, close;
    Button saveButton;
    RecyclerView recyclerView;
    Spinner spinner;

    FirebaseAuth mAuth;
    String currentUserID;
    DatabaseReference privateUserReference;
    String CategoryKey;

    List<String> spinnerArray = new ArrayList<>();
    private ScaleGestureDetector scaleGestureDetector;

    ViewGroup rootLayout;
    private int _xDelta;
    private int _yDelta;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_outfits);
        mContext = CreateOutfitActivity.this;

        deployWidgets();
        setupRecyclerView();
        setupFirebase();
        setupSpinner();

    }

    private void deployWidgets(){
        bodyImage = findViewById(R.id.bodyimage);
        outfitOne = findViewById(R.id.image_view_one);
        close = findViewById(R.id.close);
        saveButton = findViewById(R.id.saveButton);
        recyclerView = findViewById(R.id.outfit_recycler_view);
        spinner = findViewById(R.id.spinner);

        outfitOne.bringToFront();

        rootLayout = findViewById(R.id.view_root);
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(1000, 1000);
        outfitOne.setLayoutParams(layoutParams);
        outfitOne.setOnTouchListener(new ChoiceTouchListener());

    }

    private void setupRecyclerView(){
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(linearLayoutManager);
    }

    private void setupFirebase(){
        mAuth = FirebaseAuth.getInstance();
        currentUserID = mAuth.getCurrentUser().getUid();
        privateUserReference = FirebaseDatabase.getInstance().getReference().child("private_user");
    }

    private void setupSpinner(){
        spinnerArray.add("Cutouts");
        spinnerArray.add("All Items");
        spinnerArray.add("Accessories");
        spinnerArray.add("Athletic");
        spinnerArray.add("Casual");
        spinnerArray.add("Dresses");
        spinnerArray.add("Jackets");
        spinnerArray.add("Jewelery");
        spinnerArray.add("Other");
        spinnerArray.add("Pants");
        spinnerArray.add("Purses");
        spinnerArray.add("Shirts");
        spinnerArray.add("Shoes");
        spinnerArray.add("Shorts");
        spinnerArray.add("Suits");

        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(mContext, android.R.layout.simple_spinner_item, spinnerArray);
        arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(arrayAdapter);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String text = spinner.getItemAtPosition(position).toString().toLowerCase();
                CategoryKey = text;
                if (position == 1){
                    CategoryKey = text.replace("All Items", "all_items");
                }
//                if (text.equals("All Items")){
//
//                }
                queryFirebaseToDisplayCategory(CategoryKey);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

    }

    private void queryFirebaseToDisplayCategory(String CategoryKey){

        Query query = privateUserReference.child(currentUserID).child(CategoryKey).orderByKey();
        FirebaseRecyclerOptions<Category> firebaseRecyclerOptions =
                new FirebaseRecyclerOptions.Builder<Category>().setQuery(query, Category.class).build();
        FirebaseRecyclerAdapter<Category, OutfitViewHolder> firebaseRecyclerAdapter =
                new FirebaseRecyclerAdapter<Category, OutfitViewHolder>(firebaseRecyclerOptions) {
                    @Override
                    protected void onBindViewHolder(@NonNull OutfitViewHolder outfitViewHolder, int i, @NonNull Category category) {

                        String PostKey = getRef(i).getKey();

                        Picasso.get().load(category.getFile_uri()).into(outfitViewHolder.recyclerImage);
                        outfitViewHolder.mView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                privateUserReference.child(currentUserID).child(CategoryKey).child(PostKey)
                                        .addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                        String fileURI = dataSnapshot.child("file_uri").getValue().toString();
                                        displayRecyclerImage(fileURI);
                                    }

                                    @Override
                                    public void onCancelled(@NonNull DatabaseError databaseError) {

                                    }
                                });
                            }
                        });
                    }

                    @NonNull
                    @Override
                    public OutfitViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                        View view = LayoutInflater.from(mContext).inflate(R.layout.layout_outfit_item_view, parent, false);
                        return new OutfitViewHolder(view);
                    }
                };
        firebaseRecyclerAdapter.startListening();
        recyclerView.setAdapter(firebaseRecyclerAdapter);
    }

    private void displayRecyclerImage(String fileURI){
        if (fileURI != null){
            Picasso.get().load(fileURI).into(outfitOne);
        }
    }

    public class OutfitViewHolder extends RecyclerView.ViewHolder{

        View mView = itemView;
        ImageView recyclerImage;

        public OutfitViewHolder(@NonNull View itemView) {
            super(itemView);

            recyclerImage = mView.findViewById(R.id.outfit_recycler_image);
        }
    }

    private final class ChoiceTouchListener implements View.OnTouchListener {

        public boolean onTouch(View view, MotionEvent event){
            final int X = (int) event.getRawX();
            final int Y = (int) event.getRawY();
            switch (event.getAction() & MotionEvent.ACTION_MASK){
                case MotionEvent.ACTION_DOWN:
                    RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams)view.getLayoutParams();
                    _xDelta = X - lParams.leftMargin;
                    _yDelta = Y - lParams.topMargin;
                    break;
                case MotionEvent.ACTION_UP:
                    break;
                case MotionEvent.ACTION_POINTER_DOWN:
                    break;
                case MotionEvent.ACTION_POINTER_UP:
                    break;
                case MotionEvent.ACTION_MOVE:
                    RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams();
                    layoutParams.leftMargin = X - _xDelta;
                    layoutParams.topMargin = Y - _yDelta;
                    layoutParams.rightMargin = -0;
                    layoutParams.bottomMargin = -0;
                    view.setLayoutParams(layoutParams);
                    break;
            }
            rootLayout.invalidate();
            return true;
        }

    }

    private class MySimpleOnScaleGestureListener
            extends ScaleGestureDetector.SimpleOnScaleGestureListener{

        ImageView viewMyImage;

        float factor;

        public MySimpleOnScaleGestureListener(ImageView iv) {
            super();
            viewMyImage = iv;
            factor = 1.0f;
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {

            float scaleFactor = detector.getScaleFactor() - 1;
            factor += scaleFactor;
            viewMyImage.setScaleX(factor);
            viewMyImage.setScaleY(factor);
            return true;
            //return super.onScale(detector);
        }
    }
}```


For moving ImageView or whatever in the Activity you could use Animations like below.要移动 ImageView 或活动中的任何内容,您可以使用如下动画。 to Move the Image from Bottom to Top with Transparency animation, first you have to create a folder named (animation) inside RES folder and then create an Animation resource file (Right click on the created Animation Folder ) and past this code inside.要使用透明动画从底部到顶部移动图像,首先必须在 RES 文件夹中创建一个名为 (animation) 的文件夹,然后创建一个 Animation 资源文件(右键单击创建的 Animation Folder )并将此代码粘贴到其中。

<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate android:toYDelta="0%"
     android:fromYDelta="100%"
     android:duration="100"
     android:repeatCount="0" />
 <alpha android:fromAlpha="0.0" android:duration="100"
  android:toAlpha="1" />
</set>

and don't forget to call the animation inside your Activity.java并且不要忘记在 Activity.java 中调用动画

public class MainActivity extends AppCompatActivity{
    Animation anim;
    ...
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
        ImageView YourImage = findViewById(R.id.Image);
        anim = AnimationUtils.loadAnimation(this, R.anim.gotop );
        YourImage.startAnimation( anim );

}

Try this in your MySimpleOnScaleGestureListener :在你的MySimpleOnScaleGestureListener试试这个:

        @Override
        public boolean onScale(ScaleGestureDetector detector) {

            float scaleFactor = detector.getScaleFactor() - 1;
            factor += scaleFactor;

            // scale
            viewMyImage.animate().scaleX(scaleFactor);
            viewMyImage.animate().scaleY(scaleFactor);

            // move
            view.animate().translationX(distance);
            view.animate().translationY(distance);

            return true;
            //return super.onScale(detector);
        }

how's it going?怎么样了? I was wondering if anyone had any ideas on how to move an image and resize it within the same activity?我想知道是否有人对如何在同一活动中移动图像并调整其大小有任何想法? I setup a listener to move the image and that works well.我设置了一个侦听器来移动图像,并且效果很好。 The commented out code was used to resize the image and that worked well also.注释掉的代码用于调整图像大小,效果也很好。 But I am struggling to figure out how to implement some kind of GestureDetector or something similar to do both.但是我正在努力弄清楚如何实现某种GestureDetector或类似的方法来实现这两种方法。 Here is the code I have so far:这是我到目前为止的代码:


    private static final String TAG = "CreateOutfitActivity";

    Context mContext;

    ImageView bodyImage, outfitOne, close;
    Button saveButton;
    RecyclerView recyclerView;
    Spinner spinner;

    FirebaseAuth mAuth;
    String currentUserID;
    DatabaseReference privateUserReference;
    String CategoryKey;

    List<String> spinnerArray = new ArrayList<>();
    private ScaleGestureDetector scaleGestureDetector;

    ViewGroup rootLayout;
    private int _xDelta;
    private int _yDelta;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_outfits);
        mContext = CreateOutfitActivity.this;

        deployWidgets();
        setupRecyclerView();
        setupFirebase();
        setupSpinner();

    }

    private void deployWidgets(){
        bodyImage = findViewById(R.id.bodyimage);
        outfitOne = findViewById(R.id.image_view_one);
        close = findViewById(R.id.close);
        saveButton = findViewById(R.id.saveButton);
        recyclerView = findViewById(R.id.outfit_recycler_view);
        spinner = findViewById(R.id.spinner);

        outfitOne.bringToFront();

        rootLayout = findViewById(R.id.view_root);
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(1000, 1000);
        outfitOne.setLayoutParams(layoutParams);
        outfitOne.setOnTouchListener(new ChoiceTouchListener());

    }

    private void setupRecyclerView(){
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(linearLayoutManager);
    }

    private void setupFirebase(){
        mAuth = FirebaseAuth.getInstance();
        currentUserID = mAuth.getCurrentUser().getUid();
        privateUserReference = FirebaseDatabase.getInstance().getReference().child("private_user");
    }

    private void setupSpinner(){
        spinnerArray.add("Cutouts");
        spinnerArray.add("All Items");
        spinnerArray.add("Accessories");
        spinnerArray.add("Athletic");
        spinnerArray.add("Casual");
        spinnerArray.add("Dresses");
        spinnerArray.add("Jackets");
        spinnerArray.add("Jewelery");
        spinnerArray.add("Other");
        spinnerArray.add("Pants");
        spinnerArray.add("Purses");
        spinnerArray.add("Shirts");
        spinnerArray.add("Shoes");
        spinnerArray.add("Shorts");
        spinnerArray.add("Suits");

        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(mContext, android.R.layout.simple_spinner_item, spinnerArray);
        arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(arrayAdapter);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String text = spinner.getItemAtPosition(position).toString().toLowerCase();
                CategoryKey = text;
                if (position == 1){
                    CategoryKey = text.replace("All Items", "all_items");
                }
//                if (text.equals("All Items")){
//
//                }
                queryFirebaseToDisplayCategory(CategoryKey);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

    }

    private void queryFirebaseToDisplayCategory(String CategoryKey){

        Query query = privateUserReference.child(currentUserID).child(CategoryKey).orderByKey();
        FirebaseRecyclerOptions<Category> firebaseRecyclerOptions =
                new FirebaseRecyclerOptions.Builder<Category>().setQuery(query, Category.class).build();
        FirebaseRecyclerAdapter<Category, OutfitViewHolder> firebaseRecyclerAdapter =
                new FirebaseRecyclerAdapter<Category, OutfitViewHolder>(firebaseRecyclerOptions) {
                    @Override
                    protected void onBindViewHolder(@NonNull OutfitViewHolder outfitViewHolder, int i, @NonNull Category category) {

                        String PostKey = getRef(i).getKey();

                        Picasso.get().load(category.getFile_uri()).into(outfitViewHolder.recyclerImage);
                        outfitViewHolder.mView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                privateUserReference.child(currentUserID).child(CategoryKey).child(PostKey)
                                        .addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                        String fileURI = dataSnapshot.child("file_uri").getValue().toString();
                                        displayRecyclerImage(fileURI);
                                    }

                                    @Override
                                    public void onCancelled(@NonNull DatabaseError databaseError) {

                                    }
                                });
                            }
                        });
                    }

                    @NonNull
                    @Override
                    public OutfitViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                        View view = LayoutInflater.from(mContext).inflate(R.layout.layout_outfit_item_view, parent, false);
                        return new OutfitViewHolder(view);
                    }
                };
        firebaseRecyclerAdapter.startListening();
        recyclerView.setAdapter(firebaseRecyclerAdapter);
    }

    private void displayRecyclerImage(String fileURI){
        if (fileURI != null){
            Picasso.get().load(fileURI).into(outfitOne);
        }
    }

    public class OutfitViewHolder extends RecyclerView.ViewHolder{

        View mView = itemView;
        ImageView recyclerImage;

        public OutfitViewHolder(@NonNull View itemView) {
            super(itemView);

            recyclerImage = mView.findViewById(R.id.outfit_recycler_image);
        }
    }

    private final class ChoiceTouchListener implements View.OnTouchListener {

        public boolean onTouch(View view, MotionEvent event){
            final int X = (int) event.getRawX();
            final int Y = (int) event.getRawY();
            switch (event.getAction() & MotionEvent.ACTION_MASK){
                case MotionEvent.ACTION_DOWN:
                    RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams)view.getLayoutParams();
                    _xDelta = X - lParams.leftMargin;
                    _yDelta = Y - lParams.topMargin;
                    break;
                case MotionEvent.ACTION_UP:
                    break;
                case MotionEvent.ACTION_POINTER_DOWN:
                    break;
                case MotionEvent.ACTION_POINTER_UP:
                    break;
                case MotionEvent.ACTION_MOVE:
                    RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)view.getLayoutParams();
                    layoutParams.leftMargin = X - _xDelta;
                    layoutParams.topMargin = Y - _yDelta;
                    layoutParams.rightMargin = -0;
                    layoutParams.bottomMargin = -0;
                    view.setLayoutParams(layoutParams);
                    break;
            }
            rootLayout.invalidate();
            return true;
        }

    }

    private class MySimpleOnScaleGestureListener
            extends ScaleGestureDetector.SimpleOnScaleGestureListener{

        ImageView viewMyImage;

        float factor;

        public MySimpleOnScaleGestureListener(ImageView iv) {
            super();
            viewMyImage = iv;
            factor = 1.0f;
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {

            float scaleFactor = detector.getScaleFactor() - 1;
            factor += scaleFactor;
            viewMyImage.setScaleX(factor);
            viewMyImage.setScaleY(factor);
            return true;
            //return super.onScale(detector);
        }
    }
}```


声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM