Android 如何在同一活动中移动图像并缩放或调整其大小
进展如何?我想知道是否有人对如何在同一活动中移动图像并调整其大小有任何想法?我设置了一个监听器来移动图像,效果很好。注释掉的代码用于调整图像的大小,这也很有效。但我正在努力想办法实现某种手势检测器或类似的东西,两者兼而有之。以下是我目前掌握的代码:Android 如何在同一活动中移动图像并缩放或调整其大小,android,android-studio,drag-and-drop,gesture,image-scaling,Android,Android Studio,Drag And Drop,Gesture,Image Scaling,进展如何?我想知道是否有人对如何在同一活动中移动图像并调整其大小有任何想法?我设置了一个监听器来移动图像,效果很好。注释掉的代码用于调整图像的大小,这也很有效。但我正在努力想办法实现某种手势检测器或类似的东西,两者兼而有之。以下是我目前掌握的代码: private static final String TAG = "CreateOutfitActivity"; Context mContext; ImageView bodyImage, outfitOne, cl
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);
}
}
}```
私有静态最终字符串标记=“CreateOutfightActivity”;
语境;
ImageView bodyImage,OutfighOne,关闭;
按钮保存按钮;
回收视图回收视图;
纺纱机;
FirebaseAuth mAuth;
字符串currentUserID;
数据库引用privateUserReference;
字符串类别;
List spinnerray=new ArrayList();
私人scalegestruedetector scalegestruedetector;
视图组根布局;
私人国际电信公司;
私人国际酒店;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u create\u套装);
mContext=createOutfightActivity.this;
部署widgets();
setupRecyclerView();
setupFirebase();
设置微调器();
}
私有void部署小部件(){
bodyImage=findViewById(R.id.bodyImage);
OutfighOne=findViewById(R.id.image\u view\u one);
关闭=findViewById(R.id.close);
saveButton=findviewbyd(R.id.saveButton);
recyclerView=findViewById(R.id.Fattle\u Recyclers\u视图);
微调器=findViewById(R.id.spinner);
一、布林托夫隆();
rootLayout=findviewbyd(R.id.view\u root);
RelativeLayout.LayoutParams LayoutParams=新的RelativeLayout.LayoutParams(10001000);
OutfighOne.setLayoutParams(布局参数);
setOnTouchListener(新选项touchlistener());
}
私有void setupRecyclerView(){
recyclerView.setHasFixedSize(true);
LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(mContext,LinearLayoutManager.HORIZONTAL,false);
recyclerView.setLayoutManager(linearLayoutManager);
}
私有void setupFirebase(){
mAuth=FirebaseAuth.getInstance();
currentUserID=mAuth.getCurrentUser().getUid();
privateUserReference=FirebaseDatabase.getInstance().getReference().child(“private_user”);
}
私有void设置微调器(){
SpinneArray.添加(“切口”);
添加(“所有项目”);
添加(“附件”);
Spinnerray.添加(“运动”);
Spinnerray.添加(“休闲”);
添加(“连衣裙”);
Spinnerary.添加(“夹克”);
Spinnerray.添加(“珠宝店”);
添加(“其他”);
添加(“裤子”);
添加(“钱包”);
添加(“衬衫”);
添加(“鞋”);
添加(“短裤”);
添加(“套装”);
ArrayAdapter ArrayAdapter=新的ArrayAdapter(mContext,android.R.layout.simple\u微调器\u项,微调阵列);
arrayAdapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
spinner.setAdapter(阵列适配器);
spinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
String text=spinner.getItemAtPosition(position.toString().toLowerCase();
CategoryKey=文本;
如果(位置==1){
CategoryKey=text.replace(“所有项目”、“所有项目”);
}
//if(文本等于(“所有项目”)){
//
// }
queryFirebaseToDisplayCategory(CategoryKey);
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
}
私有void queryFirebaseToDisplayCategory(字符串类别key){
Query Query=privateUserReference.child(currentUserID).child(CategoryKey).orderByKey();
FirebaseRecyclerOptions FirebaseRecyclerOptions=
新建FirebaseRecyclerOptions.Builder().setQuery(查询,类别.class).build();
FirebaseRecyclerAdapter FirebaseRecyclerAdapter=
新的FirebaseRecyclerAdapter(firebaseRecyclerOptions){
@凌驾
受保护的无效onBindViewHolder(@NonNull oughtViewHolder oughtViewHolder,int i,@NonNull Category){
字符串PostKey=getRef(i).getKey();
Picasso.get().load(category.getFile_uri()).into(oughtViewHolder.recyclerImage);
OutfightViewHolder.mView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
privateUserReference.child(currentUserID).child(CategoryKey).child(PostKey)
.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
字符串fileURI=dataSnapshot.child(“文件_uri”).getValue().toString();
displayRecyclerImage(文件URI);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
});
}
@非空
@凌驾
public OutfightViewHolder onCreateViewHolder(@NonNull ViewGrou)
<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>
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 );
}
@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);
}