【问题标题】:How can I move an image and scale or resize it in the same activity如何在同一活动中移动图像并缩放或调整其大小
【发布时间】:2019-11-23 23:00:25
【问题描述】:

最近怎么样?我想知道是否有人对如何在同一活动中移动图像并调整其大小有任何想法?我设置了一个监听器来移动图像并且效果很好。注释掉的代码用于调整图像大小,效果也很好。但我正在努力弄清楚如何实现某种 GestureDetector 或类似的东西来做这两者。这是我到目前为止的代码:


    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);
        }
    }
}```


【问题讨论】:

    标签: android android-studio drag-and-drop gesture image-scaling


    【解决方案1】:

    对于移动 ImageView 或 Activity 中的任何内容,您可以使用如下所示的动画。 要使用透明动画将图像从底部移动到顶部,首先您必须在 RES 文件夹中创建一个名为 (animation) 的文件夹,然后创建一个动画资源文件(右键单击创建的动画文件夹)并将此代码粘贴到里面。

    <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>
    

    别忘了在 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 );
    
    }
    

    【讨论】:

      【解决方案2】:

      在您的 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);
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-08
        • 1970-01-01
        • 2023-01-26
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        • 2012-03-29
        相关资源
        最近更新 更多